sql >> Database >  >> RDS >> Mysql

MySQL die meerdere tabellen opvraagt

Oké, dus hoewel ik het er gedeeltelijk mee eens ben dat je wat rond moet neuzen en meer moet leren over left joins, is het ook lastig om deze vraag correct te beantwoorden die een beginner misschien kwijtraakt. Ik ga je gang en je helpen deze te beantwoorden, maar ik zou je aanraden om meer te leren over joins.

Mijn exacte vraag zou afhangen van de beschikbare indices, maar het lijkt zeer waarschijnlijk op iets als dit:

SELECT a.* 
FROM products AS a
LEFT JOIN (
SELECT product_id FROM order_products as b 
INNER JOIN orders AS c
ON b.order_id = c.order_id
WHERE c.date_ordered >= date_sub(c.date_ordered, INTERVAL 7 day)
GROUP BY product_id 
) AS d
ON a.product_id = d.product_id 
WHERE d.product_id IS NULL

Wat ik aan het doen ben, is dat ik een subquery aan het schrijven ben die bestellingen samenvoegt en producten bestelt, waarbij date_ordered binnen een bepaald datumbereik valt (ik zou aanraden om hier meer te weten te komen over de date_sub-functie:http://www.w3schools.com/sql/func_date_sub.asp en voer ook een paar snelle SELECT date_sub(date_ordered, INTERVAL X DAY) FROM orders uit om er zeker van te zijn dat u begrijpt hoe deze berekening in de praktijk werkt.

Nu krijg ik mijn lijst met bestellingen voor de laatste X dagen (7 in de bovenstaande zoekopdracht) en voeg ik deze samen met de producttabel voor bestellingen om de bestelde producten te krijgen. Hier wil ik eigenlijk mijn producten ontdubbelen. Product_id =300 is mogelijk 70 keer besteld. Product_id =200 is mogelijk 50 keer besteld. Hoe het ook zij, ik wil geen 70 records en 50 records toevoegen aan mijn producttabel voor product-ID's 300 en 200, dus ontkoppel ik ze. Dat laatste GROUP BY-statement doet dat. Het is functioneel hetzelfde als het schrijven van DISTINCT (hoewel er onder bepaalde omstandigheden kleine verschillen kunnen zijn in de manier waarop deze worden berekend, lijkt geen van die omstandigheden hier van toepassing te zijn... gebruik DISTINCT als dat duidelijker voor je is)

Zodra ik mijn lijst met unieke product-ID's heb die in de afgelopen X dagen zijn besteld, voeg ik die samen met mijn producttabel. Hier gebruik ik een left join. Zoals de opmerkingen hierboven vermeld, wil je het begrip joins behoorlijk zorgvuldig bekijken. Doe dat, als je dat nog niet hebt gedaan.

Als laatste pas ik een WHERE-filter toe met de tekst 'WHERE d.product_id IS NULL'. Wat dit doet, is zeggen:"Oké, als product_id =Y in de afgelopen X dagen is besteld, wordt het met succes toegevoegd aan mijn producttabel met a.product_id =d.product_id. Als het niet is besteld, dan is een. product_id zal bestaan ​​in mijn resultatenset, maar d.product_id niet. Dat wil zeggen, d.product_id zal null zijn."

Die laatste wending kan het deel zijn dat niet duidelijk / opvalt.

Ik hoop dat dit helpt.




  1. Geneste Select-instructie in MYSQL-join

  2. AlwaysOn-beschikbaarheidsgroepen:Quorum

  3. Google App Engine Datastore exporteren naar MySQL?

  4. Codeigniter-databasefout:1064 met MySQL en misschien een sessieconfiguratiefout