Как получить строки, даже если count равен 0? Только 1 стол - PullRequest
0 голосов
/ 07 июля 2019

Мне нужен счет, даже если он равен 0. Мой текущий запрос -

SELECT `id`,count(0) as `fetchpc` FROM `user` WHERE pid in('4,6,7,8') GROUP BY `id` 

Но он возвращает только те идентификаторы, где count больше 0

Edit: значения, используемые для in ('4,6,7,8'), сначала выбираются из базы данных в другом запросе. И тогда с помощью скрипта строки конвертируются в 4,6,7,8.

Таким образом, все значения присутствуют в базе данных.

Также возможно, что возвращаемые значения могут доходить до 100+ значений.

Ответы [ 2 ]

3 голосов
/ 07 июля 2019

Вы можете присоединиться к этому запросу по «фиктивному» запросу, который запрашивает эти идентификаторы как литералы:

SELECT    ids.id, COALESCE(cnt, 0)
FROM      (SELECT 4 AS id
           UNION ALL
           SELECT 6 AS id
           UNION ALL
           SELECT 7 AS id
           UNION ALL
           SELECT 8 AS id) ids
LEFT JOIN (SELECT id, COUNT(*) AS cnt
           FROM   fetchpc
           GROUP BY id) t ON t.id = ids.id
0 голосов
/ 07 июля 2019

Вы можете использовать производную таблицу. Я бы порекомендовал:

SELECT i.id, COUNT(u.id) as fetchpc
FROM (SELECT 4 as id UNION ALL
      SELECT 6 as id UNION ALL
      SELECT 7 as id UNION ALL
      SELECT 8 as id 
     ) i LEFT JOIN
     `user` u
     ON u.id = i.id
GROUP BY i.id;

С точки зрения производительности, это намного лучше, чем агрегирование сначала (в подзапросе), а затем объединение. По сути, агрегация (в этом случае) должна агрегировать все данных и впоследствии отфильтровывать ненужные строки.

Эта формулировка сначала фильтрует строки, что должно ускорить агрегацию.

...