проблема присоединения к SQL-запросу - PullRequest
1 голос
/ 13 апреля 2011

У меня следующий запрос, который возвращает товар и самую низкую цену продажи, найденную с количеством этой цены продажи. Все работает отлично, пока я не хочу получить продукт, который не имеет каких-либо цен в таблице product_price. Как я могу дать ему вернуть данные о продукте и NULLS для sellPrice и количества?

SELECT p.*, MIN(pp.sellPrice) as sellPrice, pp.quantity FROM `product` as p
LEFT JOIN `product_price_group` as ppg ON ppg.productId = p.`id`
LEFT JOIN `product_price` as pp ON pp.priceGroupId = ppg.`id`
WHERE p.`id` = 1 AND p.`active` = 1

Вывод продукта с доступной ценой:

+----+--------------+--------+--------------+--------------+-----------+----------+
| id | name         | active | sortSequence | creationDate | sellPrice | quantity |
+----+--------------+--------+--------------+--------------+-----------+----------+
|  1 | product_id_1 |      1 |            1 |   1287481220 |     22.00 |       10 |
+----+--------------+--------+--------------+--------------+-----------+----------+

Вывод продукта, цены на который отсутствуют.

+----+------+--------+--------------+--------------+-----------+----------+
| id | name | active | sortSequence | creationDate | sellPrice | quantity |
+----+------+--------+--------------+--------------+-----------+----------+
| NULL | NULL | NULL |         NULL |         NULL |      NULL |     NULL |
+----+------+--------+--------------+--------------+-----------+----------+

Желаемый выход:

+----+--------------+--------+--------------+--------------+-----------+----------+
| id | name         | active | sortSequence | creationDate | sellPrice | quantity |
+----+--------------+--------+--------------+--------------+-----------+----------+
|  2 | product_id_2 |      1 |            1 |   1287481220 |     NULL  |     NULL |
+----+--------------+--------+--------------+--------------+-----------+----------+

Обновление Похоже, я выбирал один товар, который не существует! Очень глупо.

Ответы [ 2 ]

0 голосов
/ 13 апреля 2011

Я МОГУ быть неправильным, но мое понимание ЛЕВОГО СОЕДИНЕНИЯ всегда было ссылкой на таблицу в тесте на равенство, как написано в операторе SQL ... а кроме того, как я пишу запросы ... Начнем с таблицы Я ожидаю ПЕРВЫЙ (слева), присоединенный к ДРУГОЙ (справа) таблице второй ... Оставьте условие соединения ТАКЖЕ соответствующим этой взаимосвязи ...

select from x left join y where x.fld = y.fld
   instead of 
select from x left join y where y.fld = x.fld

Так что я бы скорректировал ваш запрос следующим образом

SELECT
      p.*, 
      MIN(pp.sellPrice) as sellPrice, 
      pp.quantity 
   FROM 
      product as p
         LEFT JOIN product_price_group as ppg 
            ON p.id = ppg.productId
            LEFT JOIN product_price as pp 
               ON ppg.id = pp.priceGroupId
   WHERE 
          p.id = 1 
      AND p.active = 1

Кроме того, вы можете заключить ваши min () и количество в IFNULL (поле, 0), чтобы не показывать NULLS, а вместо этого иметь действительные нулевые значения.

0 голосов
/ 13 апреля 2011

Как насчет использования LEFT OUTER JOIN для таблицы product_price?

SELECT p.*, MIN(pp.sellPrice) as sellPrice, pp.quantity FROM `product` as p
LEFT JOIN `product_price_group` as ppg ON ppg.productId = p.`id`
LEFT OUTER JOIN `product_price` as pp ON pp.priceGroupId = ppg.`id`
WHERE p.`id` = 1 AND p.`active` = 1

Это то, что вы хотите?

ОБНОВЛЕНИЕ: Редакция - Как говорят другие, LEFT JOIN = LEFT (OUTER) JOIN, так что это не поможетВы в этом случае ...

...