sql >> Database teknologi >  >> RDS >> Mysql

MySQL Forespørgsel efter flere tabeller

Okay, så selvom jeg til dels er enig i, at du bør kigge lidt rundt og lære mere om venstre joins, er der også nogle vanskeligheder ved at besvare dette spørgsmål korrekt, som kan gå tabt for en nybegynder. Jeg vil gå videre og hjælpe dig med at besvare det, men jeg vil anbefale at lære mere om joins.

Min nøjagtige forespørgsel vil afhænge af de tilgængelige indekser, men det ligner meget sandsynligt noget som dette:

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, jeg gør, er, at jeg skriver en underforespørgsel, der samler ordrer og bestiller produkter, hvor date_ordered falder inden for et bestemt datointerval (jeg vil anbefale at lære om date_sub-funktionen her:http://www.w3schools.com/sql/func_date_sub.asp og lav også et par hurtige SELECT date_sub(date_ordered, INTERVAL X DAY) FROM ordreforespørgsler for at sikre, at du forstår, hvordan denne beregning fungerer i praksis.

Nu får jeg min liste over ordrer for de sidste X dage (7 i forespørgslen ovenfor), og jeg forbinder den med ordreprodukttabellen for at få de produkter, der blev bestilt. Her vil jeg dybest set fjerne mine produkter. Product_id =300 er muligvis blevet bestilt 70 gange. Product_id =200 kan være blevet bestilt 50 gange. Uanset hvad der er tilfældet, ønsker jeg ikke at tilføje 70 poster og 50 poster til min produkttabel for produkt-id'er 300 og 200, så jeg fjerner dem. Det sidste GROUP BY-udsagn gør det. Det er funktionelt det samme som at skrive DISTINCT (selvom der kan være mindre forskelle i, hvordan disse beregnes under visse omstændigheder, ser ingen af ​​disse omstændigheder ud til at være gældende her... brug DISTINCT, hvis det er tydeligere for dig)

Når jeg har min liste over unikke produkt-id'er, der blev bestilt inden for de seneste X dage, slutter jeg mig til den med min produkttabel. Her bruger jeg en venstre join. Ligesom kommentarerne nævnt ovenfor, vil du gerne undersøge begrebet joinforbindelser ret omhyggeligt. Gør det, hvis du ikke allerede har gjort det.

Til sidst anvender jeg et WHERE-filter, der siger "WHERE d.product_id IS NULL." Det, dette gør, er at sige, "okay, hvis product_id =Y blev bestilt inden for de seneste X dage, så vil det blive tilsluttet min produkttabel med succes med a.product_id =d.product_id. Hvis det ikke blev bestilt, så en. product_id vil eksistere i mit resultatsæt, men d.product_id vil ikke. Det vil sige, d.product_id vil være null."

Det sidste twist kan være den del, der ikke er synlig / skiller sig ud.

Håber dette hjælper.




  1. Tilslut MySQL Workbench på WSL MySQL?

  2. Mysql - Lagret procedure OUT variabel returnerer null

  3. ms-access kunne ikke slette

  4. Ændre det aktuelle antal af en Auto Increment-værdi i MySQL?