Miért jönnek le rossz adatok ezzel az sql lekérdezéssel?
Van két táblám (Mysql, MariaDB), az egyikben azonosítókat tárolok termékekről. Egy terméknek három féle azonosítója lehet, kétfajta gyártói azonosítója és egy EAN száma. Egy termék adatai egy sorban szerepelnek a következőképpen:
TermékazonosítóID Ean Termékazonosító1 Termékazonosító2
Van egy másik táblám a termékek tábla, ahol a TermékazonosítóID egy idegen kulcs. Egy termék többször is szerepelhet, de maximum háromszor, három különböző szállítótól, három beszerzési és eladási áron. Nem minden szállító szállít minden terméket.
Csoportosítanom kellene a TermékazonosítóID szerint a termékeket és leszednek azokat, ahol az eladási ár a legalacsonyabb.
Az eladási ár tényleg a legalacsonyabb lesz, de amikor három szállítótól is jön egy termék, az összes többi adat nem feltétlenül a jó adat. Tehát lehetséges, hogy másik szállító, másik termékID stb... Az ár mindig a minimális.
Miért?
A lekérdezés a következő:
SELECT productidentifiers.*, MIN(products.SellingPrice) as MinPrice,
products.ProductName, products.Supplier stb...
FROM products
INNER JOIN productidentifiers
ON products.ProductIdentifierID = productidentifiers.RelationID
GROUP BY productidentifiers.RelationID;
Szóval tényleg a minimális árat hozza le a lekérdezés, de van, hogy az összes többi adat nem jó, tehát nem az a szállító, nem az a termékID stb...
Számomra ez érthetetlen az egész, tekintettel arra, hogy ennek egészen biztosan nem így kellene működnie normális esetben.
Valami tipp?
Ez azért van, mert semmi megszorítás nincs arra, hogy a minimális árú termék adatait kérje le. Igen, lekéred az árak minimumát, de ez nem vonja maga után, hogy a többi adat is a minimális értékű terméktől fog jönni.
Ezt úgy kell megközelíteni, hogy egy subquery-ben először lekéred hogy melyik terméknek mennyi a minimum ára, és inner join-al hozzárendeled saját magához úgy, hogy az id és a minimum érték is meg kell egyezzen. Így a product tábládat leszűkíted azokra a sorokra, amelyik a minimális értékeket tartalmazza. Valahogy így:
SELECT ...
FROM products
INNER JOIN
(
    SELECT ProductIdentifierID, MIN(SellingPrice) as min_price
    FROM products
    GROUP BY ProductIdentifierID
) as min_product ON min_product.ProductIdentifierID = product.ProductIdentifierID AND min_product.SellingPrice = product.SellingPrice
INNERJOIN productidentifiers ... a többi kb ugyanaz marad.
Köszönöm szépen a választ, már korábban megtaláltam mi a hiba, de ha nem találtam volna meg, akkor segített volna.
Minden jót!
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!