MySQL возвращает значение по умолчанию 0 в сумме, когда нет результатов - PullRequest
0 голосов
/ 12 января 2019

Я застрял в запросе, когда добавляю предложение where. Как и ожидалось, я не получаю никаких результатов, поэтому с SUM работать нечем. Я пытаюсь вернуть значение по умолчанию 0 для countSend и countPending, когда ни одна строка не соответствует инструкции where.

SELECT
  SUM(CASE WHEN orders.status = "send" THEN 1 ELSE 0 END) countSend,
  SUM(CASE WHEN orders.status = "pending" THEN 1 ELSE 0 END) countPending
FROM orders
  LEFT OUTER JOIN order_posts AS op ON op.order_id = orders.id
  LEFT OUTER JOIN posts AS p ON p.id = op.post_id
WHERE (orders.id LIKE "%Shop 3%") OR (p.title LIKE "%Shop 3%")
  GROUP BY orders.id
  LIMIT 1

Ответы [ 2 ]

0 голосов
/ 12 января 2019

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

SELECT SUM(o.status = 'send') as countSend,
       SUM(o.status = 'pending') as countPending
FROM orders o LEFT OUTER JOIN
     order_posts op
     ON op.order_id = o.id LEFT OUTER JOIN
     posts p
     ON p.id = op.post_id
WHERE (o.id LIKE '%Shop 3%') OR (p.title LIKE '%Shop 3%');

Если предложение WHERE отфильтровывает все, вы все равно получите одну строку со значениями NULL. Используйте COALESCE() для возврата 0 вместо:

SELECT COALESCE(SUM(o.status = 'send'), 0) as countSend,
       COALESCE(SUM(o.status = 'pending'), 0) as countPending
0 голосов
/ 12 января 2019

Вы можете использовать coalesce(), который будет возвращать значение, к которому относится первое выражение, когда это значение не равно NULL, или значение второго выражения. (Это также относится к более чем двум выражениям, но в вашем случае это только два).

SELECT coalesce(sum(CASE
                      WHEN orders.status = "send" THEN
                        1
                      ELSE
                        0
                    END),
                0) countSend,
       coalesce(sum(CASE
                      WHEN orders.status = "pending" THEN
                        1
                      ELSE
                        0
                    END),
                0) countPending
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...