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

MySQL esegue query su più tabelle

Va bene, quindi, mentre sono in parte d'accordo sul fatto che dovresti dare un'occhiata e saperne di più sui join sinistro, c'è anche qualche difficoltà nel rispondere correttamente a questa domanda che potrebbe essere perso per un principiante. Andrò avanti e ti aiuterò a rispondere, ma consiglierei di saperne di più sui join.

La mia esatta query dipenderebbe dagli indici disponibili, ma molto probabilmente assomiglierà a qualcosa del genere:

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

Quello che sto facendo è scrivere una sottoquery che unisce ordini e prodotti di ordini insieme, in cui date_ordered rientra in un determinato intervallo di date (raccomanderei di conoscere la funzione date_sub qui:http://www.w3schools.com/sql/func_date_sub.asp e fai anche alcune rapide SELECT date_sub(date_ordered, INTERVAL X DAY) FROM order query per assicurarti di capire come funziona questo calcolo, in pratica.

Ora ottengo il mio elenco di ordini degli ultimi X giorni (7 nella query sopra) e lo unisco alla tabella dei prodotti degli ordini per ottenere i prodotti che sono stati ordinati. Qui, in pratica, voglio deduplicare i miei prodotti. Product_id =300 potrebbero essere stati ordinati 70 volte. Product_id =200 potrebbero essere stati ordinati 50 volte. In ogni caso, non voglio unire 70 record e 50 record alla mia tabella dei prodotti per gli ID prodotto 300 e 200, quindi li ho eliminati. L'ultima istruzione GROUP BY lo fa. Funzionalmente è la stessa cosa che scrivere DISTINCT (sebbene ci possano essere piccole differenze nel modo in cui vengono calcolate in determinate circostanze, nessuna di queste circostanze sembra essere applicabile qui... usa DISTINCT se ti è più chiaro)

Una volta che ho il mio elenco di ID prodotto univoci che sono stati ordinati negli ultimi X giorni, lo unisco alla mia tabella dei prodotti. Qui, io uso un join sinistro. Come i commenti sopra indicati, ti consigliamo di esaminare la nozione di join con molta attenzione. Fallo, se non l'hai già fatto.

Infine, applico un filtro WHERE che dice "WHERE d.product_id IS NULL". Ciò che sta facendo è dire "ok, se product_id =Y è stato ordinato negli ultimi X giorni, verrà unito correttamente alla tabella dei miei prodotti con a.product_id =d.product_id. Se non è stato ordinato, a. product_id esisterà nel mio set di risultati, ma d.product_id no. Cioè, d.product_id sarà nullo."

L'ultima svolta potrebbe essere la parte che non è evidente / che si distingue.

Spero che sia di aiuto.