@TechNOIR

MySQL нужна помощь в составлении запроса. Возможен ли такой запрос?

Всем привет.
Есть два запроса.

1 запрос - показываем список дат с временем 22:00 из одно таблицы
SELECT DATE_FORMAT(tt.create_time,"%Y-%m-%d 22:00:00") AS DAY,tt.id FROM tick tt GROUP BY DATE_FORMAT(tt.create_time,"%Y-%m-%d")


2 запрос - показывает количество записей у которых create_time меньше указанной в запросе даты
SELECT COUNT(*) AS count FROM(
SELECT * FROM
(SELECT * FROM tick_history th WHERE th.create_time < '2019-04-15 22:00:00' ORDER BY th.id DESC)
AS t1 GROUP BY t1.tick_id
) AS t2 WHERE t2.state NOT IN (1,4,9) AND t2.queue = 1


Можно ли как-то эти два запроса обьединить так чтобы получить один столбец с датами из первого запроса, а второй столбец это количество из второго запроса по каждой дате из первого столбца? Тоесть как бы подставляется дата и высчитывается количество вторым запросом..
Возможно ли это? Помогите с запросом пожалуйсте

Спасибо заранее
  • Вопрос задан
  • 73 просмотра
Решения вопроса 2
DevMan
@DevMan
возможно: осилить джоины и способы работы с датой.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Какая же жуть у вас написана. Мало того, что запросы неэффективные, так они ещё и не будут работать в свежих версиях MySQL с настройками по умолчанию. В стандарте SQL при группировке можно выбирать только поля, входящие в условия группировки или в агрегатные функции, то есть выбор * при группировке - это ошибка.

Но, даже если брать старые версии MySQL, то условия во втором запросе всё равно кривые. При группировке нескольких строк поля, не входящие в условие группировки или агрегатное выражение могут быть взяты из любой из группируемых строк (что хорошо видно в новых версиях, где введена функция ANY_VALUE). Значит `state` и `queue` могут быть из любой строки.

SELECT `d`.`datetime`, COUNT(`th`.`create_time`) AS `count`
  FROM (
    SELECT DISTINCT DATE(`create_time`) + INTERVAL 22 HOUR AS `datetime`
      FROM `tick`
  ) AS `d`
  LEFT JOIN `tick_history` AS `th` 
    ON `th`.`create_time` < `d`.`datetime`
      AND `th`.`state` NOT IN (1, 4, 9)
      AND `th`.`queue` = 1
  GROUP BY `d`.`datetime`
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы