PHP + MySQL как приклеить значение таблицы (JOIN) по нескольким условиям?

Никак не могу понять, как можно выбрать значение в иной таблице по нескольким условиям.
Ситуация такая: осуществляется выбор данных 1 продукта:
SELECT p.price, p.model, p.image
    FROM product AS p ...

Необходимо приклеить таблицу с спецценами по акции. В ней несколько значений: ID продукта, цена, дата начала акции, дата конца акции. Необходимо взять значение (если оно имеется) из этой таблицы где ID продукта равно ID продукта акций.
SELECT p.price, p.model, p.image, ps.price as sp_price
    FROM product AS p
    LEFT JOIN product_special as ps USING (product_id)

Но. Отсеять необходимо как по ID продукта, так и по началу/концу акции. Я внес дополнительные условия в WHERE
SELECT p.price, p.model, p.image, ps.price as sp_price
    FROM product AS p
    LEFT JOIN product_special as ps USING (product_id)
WHERE p.quantity > 0 AND p.product_id = "'.$product_id.'" AND ((ps.date_start < NOW()) AND ( ps.date_end > NOW())) LIMIT 1

И потом на PHP проверяю, если sp_price не пуст, то выводить price. Условия работают только при прохождении акции, а при ее отсутствии запрос валится, так как парсер не находит ячейки с подходящей акцией и вообще выдает нулевое значение.
Я уже понял, что условия получились глупые, и так и должно быть, но как это можно вообще осуществить? В JOIN дополнительные условия через ON прописать, как я понял нельзя, а в WHERE вписываются общие условия и при отсутствии нужного результата скрывают вообще все запросы.
  • Вопрос задан
  • 2555 просмотров
Решения вопроса 1
hedint
@hedint
Senior front-end developer
Во-первых, можно сделать обычный запрос в стиле
SELECT p.*, ps.price as special_price FROM product p
LEFT JOIN product_special ps ON p.id = ps.product_id

и разруливать то, что вам нужно (проверять, есть ли акция) уже в коде вашего приложения.

Во-вторых, можно соорудить что-то типа:
SELECT p.id, 
IF (ps.price IS NOT NULL AND ps.date_start < NOW() AND ps.date_end > NOW() , ps.price, p.price) as price FROM product p
LEFT JOIN product_special ps ON p.id = ps.product_id

Как пример - если акция задана, мы получим цену с акцией, если нет - цену из product.price
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@BIG_bu
SELECT p.price, p.model, 
 ( SELECT ps.price as sp_price
    FROM product_special AS ps
    WHERE NOW() BETWEEN ps.date_start AND ps.date_end
                 AND ps.product_id  = "'.$product_id.'"
    LIMIT 1
) as sp_price
FROM product as p
WHERE p.quantity > 0 AND p.product_id = "'.$product_id.'"

что-то такое... ?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы