sql >> Databasteknik >  >> RDS >> Mysql

MySQL frågar efter flera tabeller

Okej, även om jag delvis håller med om att du bör leta runt och lära dig mer om vänsteranslutningar, finns det också en del knepigheter att svara på den här frågan korrekt som kan gå förlorad för en nybörjare. Jag ska gå vidare och hjälpa dig att svara på det, men jag rekommenderar att du lär dig mer om anslutningar.

Min exakta fråga beror på tillgängliga index, men det liknar mycket troligt något så här:

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

Det jag gör är att jag skriver en underfråga som sammanfogar beställningar och beställer produkter, där date_ordered faller inom ett visst datumintervall (jag skulle rekommendera att lära sig om date_sub-funktionen här:http://www.w3schools.com/sql/func_date_sub.asp och gör även några snabba SELECT date_sub(date_ordered, INTERVAL X DAY) FROM orderfrågor för att se till att du förstår hur den här beräkningen fungerar i praktiken.

Nu får jag min lista över beställningar för de senaste X dagarna (7 i frågan ovan) och jag ansluter den till produkttabellen för beställningar för att få de produkter som beställdes. Här vill jag i princip ta bort mina produkter. Product_id =300 kan ha beställts 70 gånger. Product_id =200 kan ha beställts 50 gånger. Hur det än är så vill jag inte koppla 70 poster och 50 poster till min produkttabell för produkt-id 300 och 200, så jag tar bort dem. Det sista GROUP BY-påståendet gör det. Det är funktionellt samma sak som att skriva DISTINCT (även om det kan finnas mindre skillnader i hur dessa beräknas under vissa omständigheter, verkar ingen av dessa omständigheter gälla här... använd DISTINCT om det är tydligare för dig)

När jag har min lista över unika produkt-ID som beställts under de senaste X dagarna, ansluter jag den till min produkttabell. Här använder jag en vänsterkoppling. Liksom kommentarerna ovan, bör du undersöka begreppet sammanfogningar ganska noggrant. Gör det om du inte redan har gjort det.

Sist använder jag ett WHERE-filter som säger "WHERE d.product_id IS NULL." Vad det här gör är att säga, "okej, om product_id =Y beställdes under de senaste X dagarna, kommer det att anslutas till min produkttabell framgångsrikt med a.product_id =d.product_id. Om det inte beställdes, då en. product_id kommer att finnas i min resultatuppsättning, men d.product_id kommer inte att finnas. Det vill säga, d.product_id kommer att vara null."

Den sista vändningen kan vara den del som inte är uppenbar / sticker ut.

Hoppas det här hjälper.




  1. MySQL-avgränsningssatsfel

  2. hur skickar du e-post med Pl/sql

  3. Varning:Uppdrag i skick

  4. MySQL:Få start- och sluttidsstämpel för varje dag