Установка значения по умолчанию для столбцов NULL из LEFT JOIN и фильтрация с использованием WHERE - PullRequest
11 голосов
/ 16 декабря 2011

У меня есть таблица предметов, и у меня есть отдельная таблица, содержащая отдельные покупки каждого предмета.Не каждый предмет был куплен.Я выбираю количество покупок и соединяю его с таблицей товаров с заявлением, подобным следующему:

SELECT items.name, purchases_count
FROM `items` 
    LEFT JOIN (SELECT sales.item_name, SUM(unit_sales) AS purchases_count 
        FROM sales GROUP BY item_name) sales ON sales.item_name = items.uid

Это приводит к данным, похожим на:

+------+-----------------+
| name | purchases_count |
|------+-----------------+
| Shoe | 12              |
| Belt | NULL            |
+------+-----------------+

Моя проблема возникает, когдаЯ хочу отфильтровать этот результат на purchases_count.Если я использую WHERE purchases_count < 10 или что-то подобное, предметы, не имеющие записи о продажах вообще (т. Е. Предметы со значением NULL), исключаются из поиска.

Я пытался использовать COALESCE(purchases_count,0) AS purchases_count, который работает правильноустановите NULL записи в 0, но они все еще не появляются при использовании WHERE.Я подозреваю, что COALESCE происходит после WHERE.

Я бы хотел иметь возможность фильтровать по этому номеру, используя WHERE и включать NULL результаты (как нули), если это возможно.Есть предложения?

Ответы [ 6 ]

8 голосов
/ 16 декабря 2011

Псевдонимы обычно не применяются в предложении WHERE - попробуйте COALESCE(purchases_count,0) AS purchases_count_2 с where purchases_count_2 < 10, чтобы понять, о чем я.

2 голосов
/ 16 декабря 2011

Вместо того, чтобы считать покупки в отдельном запросе, просто сгруппируйте основной запрос. Чтобы отфильтровать счет, поместите это в having caluse:

select i.name, coalesce(sum(s.unit_sales), 0) as purchases_count
from items i
left join sales s on s.item_name = i.uid
group by i.name
having purchases_count < 10
1 голос
/ 16 декабря 2011

Как насчет:

WHERE (purchases_count < 10) OR (purchases_count IS NULL)

Конечно, вы все равно остались бы с нулевыми значениями, но вы все равно можете попробовать опцию COALESCE, чтобы превратить эти нули в нули для дальнейшего использования.

0 голосов
/ 16 декабря 2011

попробуй это

SELECT items.name, IFNULL(purchases_count,0)
FROM `items` 
LEFT JOIN (
            SELECT item_name, SUM(unit_sales) AS purchases_count 
            FROM sales GROUP BY item_name
           ) s ON s.item_name = items.uid
GROUP BY items.name
HAVING purchases_count >10
0 голосов
/ 16 декабря 2011

Итак, вы можете добавить предложение where следующим образом:

 WHERE purchases_count < 10 OR purchases_count is NULL
0 голосов
/ 16 декабря 2011

COALESCE - правильный путь, но вы не должны использовать WHERE, попробуйте: -

HAVING purchases_count<=10
...