#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. Вам тоже спасибо! Это тоже работает отлично 🙂