2010-10-23 8 views
7

Ho cercato di avvolgere la mia mente su questo problema ma non sto facendo molti progressi. Il mio obiettivo è fare un join sinistro tra due tabelle con i criteri per la tabella giusta. Vorrei vedere l'elenco di tutti i prodotti e i prezzi per il giorno corrente anche se non esiste una riga di prezzo per il giorno corrente. Ecco un esempio del codice:left join with condition per la tabella di destra in mysql

SELECT products.id, products.name, prices.price 
FROM products LEFT JOIN prices 
ON products.id = prices.id 
WHERE prices.date = CURRENT_DATE 

Questo produce solo i prodotti con informazioni sui prezzi per la data corrente.

OK, quindi questa è solo la prima parte del mio problema. Vorrei infine ritirare il prezzo per CURRENT_DATE + INTERVAL 1 DAY.

Qualsiasi informazione sarebbe molto apprezzata.

risposta

9

Supponendo PRICES.date è un tipo di dati DATETIME, utilizzare:

SELECT pd.id, 
      pd.name, 
      pr.price 
    FROM PRODUCTS pd 
LEFT JOIN PRICES pr ON pr.id = pd.id 
        AND DATE(pr.date) = CURRENT_DATE 

ho usato il DATE function per rimuovere la porzione di tempo, perché CURRENT_DATE non includerà la parte di tempo, mentre i record DATETIME farà.

In questo esempio, i criteri date vengono applicati prima del l'unione viene effettuata. È come una tabella derivata, che filtra le informazioni prima che venga eseguito JOIN, il che produce risultati diversi rispetto a quando i criteri sono stati specificati nella clausola WHERE.

Per ottenere l'elenco dei prodotti e dei prezzi per il domani, utilizzare:

SELECT pd.id, 
      pd.name, 
      pr.price 
    FROM PRODUCTS pd 
LEFT JOIN PRICES pr ON pr.id = pd.id 
        AND DATE(pr.date) = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) 

Riferimento:

Se si desidera sia di oggi e dei prezzi di domani in un unico query, utilizzare:

SELECT pd.id, 
      pd.name, 
      pr1.price AS price_today, 
      pr2.price AS price_tomorrow 
    FROM PRODUCTS pd 
LEFT JOIN PRICES pr1 ON pr1.id = pd.id 
        AND DATE(pr1.date) = CURRENT_DATE 
LEFT JOIN PRICES pr2 ON pr2.id = pd.id 
        AND DATE(pr2.date) = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) 
+0

imparato qualcosa di nuovo oggi :) – almaruf

1
SELECT id, 
     name, 
     (SELECT price 
      FROM prices 
     WHERE id = products.id 
      AND prices.date = CURRENT_DATE 
     ) AS price, 
     (SELECT price 
      FROM prices 
     WHERE id = products.id 
      AND prices.date = DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY) 
     ) AS price_tomorrow 
    FROM products 
5

Risposte forti sopra. Aggiungendo alla risposta di OMG Ponies ... avere i criteri "giusti" della tabella nell'istruzione WHERE originale trasforma sostanzialmente LEFT OUTER JOIN in INNER JOIN. Solo un modo diverso di guardarlo che potrebbe aiutare.