левое соединение с условием для правой таблицы в MySQL - PullRequest
7 голосов
/ 23 октября 2010

Я пытался обернуть голову вокруг этой проблемы, но я не добиваюсь большого прогресса.Моя цель - сделать левое соединение между двумя таблицами с критериями для правой таблицы.Я хотел бы видеть список всех продуктов и цен на текущий день, хотя для текущего дня нет строки с ценами.Вот пример кода:

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

Это производит только продукты с информацией о цене на текущую дату.

ОК, так что это только первая часть моего выпуска.В конце концов, я бы тоже хотел получить цену за CURRENT_DATE + INTERVAL 1 DAY .

Любая информация будет принята с благодарностью.

Ответы [ 3 ]

10 голосов
/ 23 октября 2010

Предполагая, что PRICES.date является типом данных DATETIME, используйте:

   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

Я использовал функцию DATE , чтобы удалить часть времени, потому что CURRENT_DATE не будет включать часть времени, в то время как записи DATETIME будут.

В этом примере date критерии применяются до соединения. Это как производная таблица, отфильтровывающая информацию перед созданием JOIN - которая даст результаты, отличные от тех, которые были указаны в предложении WHERE.

Чтобы получить список продуктов и цен на завтра, используйте:

   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)

Справка:

Если вы хотите, чтобы цены за сегодня и завтра в одном запросе, используйте:

   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)
6 голосов
/ 23 октября 2010

Сильные ответы выше.Добавление к OMG Ponies 'answer ... имеющего' правильные 'критерии таблицы в исходном операторе WHERE в основном превращает LEFT OUTER JOIN в INNER JOIN.Просто другой взгляд на это может помочь.

1 голос
/ 23 октября 2010
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
...