Как объединить два запроса, где оба имеют количество и группировку, без головной боли?

#mysql #join #union

#mysql #Присоединиться #объединение

Вопрос:

Я пытался объединить результаты двух запросов в одной таблице, чтобы подсчитать их и отсортировать по часам.

Я пробовал SELECT и UNION ALL , но безуспешно. Я обыскал весь StackOverflow и Google, но все время испытываю головные боли. Если я выполняю свой запрос по одному — все хорошо, и я получаю свой результат.

Запрос 1:

 SELECT COUNT(*) as peopleCount, date_format( timestamp, '%H' ) as hours 
FROM unknownCheckin
WHERE timestamp > '2019-03-01 23' and eid = '222' 
GROUP BY hours 
order by timestamp ASC
  

Запрос 2:

 SELECT COUNT(*) as peopleCount, date_format( timestamp, '%H' ) as hours
FROM checkin 
WHERE timestamp > '2019-03-01 23' and eid = '222' 
GROUP BY hours 
order by timestamp ASC
  

Мой эксперимент был:

 SELECT COUNT(*) as peopleCount, date_format( timestamp, '%H' ) as hours FROM unknownCheckin
INNER JOIN checkin
ON unknownCheckin.eid = checkin.eid
WHERE timestamp > '2019-03-01 23' and eid = '222' 
GROUP BY hours order by timestamp ASC
  

1052 — Столбец ‘timestamp’ в списке полей неоднозначен

Ожидаемый результат при выполнении одного запроса1:

 --------------------------------------------------
| peopleCount    | hours                         |
--------------------------------------------------
| 4              | 21                            |
--------------------------------------------------
| 1              | 22                            |
--------------------------------------------------
| 1              | 00                            |
--------------------------------------------------
  

Запрос 2:

 --------------------------------------------------
| peopleCount    | hours                         |
--------------------------------------------------
| 10             | 22                            |
--------------------------------------------------
| 22             | 23                            |
--------------------------------------------------
| 12             | 00                            |
--------------------------------------------------
| 5              | 01                            |
--------------------------------------------------
  

Что я хочу видеть, так это:

 --------------------------------------------------
| peopleCount    | hours                         |
--------------------------------------------------
| 4              | 21                            |
--------------------------------------------------
| 11             | 22                            |
--------------------------------------------------
| 22             | 23                            |
--------------------------------------------------
| 13             | 00                            |
--------------------------------------------------
| 5              | 01                            |
--------------------------------------------------

  

Извините, у меня закончились мозговые силы.
Помощь приветствуется!

Ответ №1:

Возможно, вы хотите использовать здесь объединение:

 SELECT
    hours,
    COUNT(*) as peopleCount
FROM
(
    SELECT DATE_FORMAT(timestamp, '%H') AS hours
    FROM unknownCheckin
    WHERE timestamp > '2019-03-01 23' AND eid = '222'
    UNION ALL
    SELECT DATE_FORMAT(timestamp, '%H')
    FROM checkin
    WHERE timestamp > '2019-03-01 23' AND eid = '222'
) t
GROUP BY hours
ORDER BY -FIELD(hours, '23', '22');
  

Комментарии:

1. Вау! Это было действительно быстро и безупречно. Сейчас я просто пытаюсь отобразить их в правильном порядке 22 / 23 / 00 / 01 теперь у меня есть — 00 / 01 / 23 имеет смысл, что это определяет его как цифру, а не как время…

2. ‘%a%H’ был лучшим результатом <3

3. @IESPOTO Я предоставил вам возможность сортировать так, как вы ожидаете.

4. Я бы рекомендовал задать новый вопрос, хотя бы по той причине, что на него посмотрит гораздо больше людей. Если только у вас нет очень небольшого продолжения, связанного с этим вопросом.

Ответ №2:

ОБЪЕДИНИТЕ для 2 запросов, а затем получите сумму peopleCount:

 select 
  t.hours,
  sum(t.peopleCount) peopleCount
from (
  SELECT COUNT(*) as peopleCount, date_format( timestamp, '%H' ) as hours 
  FROM unknownCheckin
  WHERE timestamp > '2019-03-01 23' and eid = '222' 
  GROUP BY hours 
  union all
  SELECT COUNT(*) as peopleCount, date_format( timestamp, '%H' ) as hours
  FROM checkin 
  WHERE timestamp > '2019-03-01 23' and eid = '222' 
  GROUP BY hours 
) t
group by t.hours
  

Комментарии:

1. Вам тоже спасибо! Это тоже работает отлично 🙂