Использование union и count(*) вместе в SQL-запросе

У меня есть запрос SQL, выглядит примерно так:

select name, count (*) from Results group by name order by name

и другой, идентичный, который загружает из архива таблицу результатов, но поля те же.

select name, count (*) from Archive_Results group by name order by name

Как мне объединить их в одном запросе? (Так что группа по-прежнему будет работать правильно). Я пробовал с объединением всех, однако это не сработает. Что мне не хватает?


person David Božjak    schedule 12.08.2009    source источник


Ответы (4)


Если у вас есть поддерживающие индексы и относительно большое количество, что-то вроде этого может быть значительно быстрее, чем предлагаемые решения:

SELECT name, MAX(Rcount) + MAX(Acount) AS TotalCount
FROM (
  SELECT name, COUNT(*) AS Rcount, 0 AS Acount
  FROM Results GROUP BY name
  UNION ALL
  SELECT name, 0, count(*)
  FROM Archive_Results
  GROUP BY name
) AS Both
GROUP BY name
ORDER BY name;
person Steve Kass    schedule 12.08.2009
comment
К вашему сведению, я нажал «Оба» как зарезервированное слово. MySQL 5.1 (кстати) - person Douglas; 03.08.2013
comment
Я думаю, что вместо того, чтобы поддерживать два столбца, SUM(Count) также будет работать. - person Rana; 19.07.2014

Ваша цель...

  1. Чтобы подсчитать все экземпляры «Боб Джонс» в обеих таблицах (например)
  2. Подсчитать все экземпляры «Боб Джонс» в Results в одной строке и все экземпляры «Боб Джонс» в Archive_Results в отдельной строке?

Предполагая, что это № 1, вам нужно что-то вроде...

SELECT name, COUNT(*) FROM
(SELECT name FROM Results UNION ALL SELECT name FROM Archive_Results)
GROUP BY name
ORDER BY name
person VoteyDisciple    schedule 12.08.2009
comment
как насчет случая 2? - person Luna Lovegood; 30.03.2020
comment
Для № 2 вам, вероятно, лучше просто запустить два запроса и объединить их в программном обеспечении. Но вы также можете просто сделать SELECT name, COUNT(1) FROM Results GROUP BY name UNION SELECT name, COUNT(1) FROM Archive_Results, если вам абсолютно необходимо объединить их. - person VoteyDisciple; 30.03.2020

person    schedule
comment
Спасибо. Все, чего мне не хватало, так это части as temp... Забыл, что мне нужно назвать таблицу, которую я создаю, чтобы это работало. - person David Božjak; 12.08.2009
comment
Это даст неверный ответ. На самом деле, это даст 1 для каждого имени, потому что UNION по умолчанию является UNION DISTINCT. Используйте СОЮЗ ВСЕХ. - person Steve Kass; 12.08.2009
comment
Спасибо, Стив Касс, однако я уже знал, что мне нужно использовать UNION ALL. Как уже говорилось выше, все, чего мне не хватало, так это термин as. - person David Božjak; 13.08.2009
comment
@Rekreativc: Нет проблем. Я прокомментировал, потому что вы отметили решение как лучший ответ, и я не хотел, чтобы будущие читатели думали, что это правильный ответ. - person Steve Kass; 13.08.2009

person    schedule
comment
Что ваш ответ добавляет к предыдущим? - person greybeard; 16.12.2020