Как правильно написать такой запрос? - MySQL
Формулировка задачи:
Привет!
Делаю свой саппорт, не знаю как правильно, нигде не видел, поэтому создаю свой велосипед. Есть 2 таблицы. В одной содержится вся основная инфа (кто создал тикет (его логин), номер этого самого тикета, его тема, дата ну и так далее). Во второй таблице уже содержатся все сообщения. Идея вот в чем: при ответе на тикет берется его номер и во вторую таблицу кладется номер тикета, сообщение, и дата этого сообщения.
Теперь встала необходимость вывести эти данные. Чтобы не создавать несколько запросов, хотелось бы создать один, результатом которого я бы получил помимо основной инфы (дата, тема и тд) еще и количество сообщений оставленных в данном тикете (инфа из второй таблицы) и сами эти сообщения. Какие запросы я только не создавал и выходило постоянно не так, как я планирую.
Создал в бд несколько тикетов, на каждый во второй таблице оставил по нескольку сообщений, в итоге мой последний запрос (его я выложу ниже) отдает мне только 1 тикет и 1-е сообщение в нем. Надеюсь я все правильно объяснил, и люди меня поймут.
Таблицы: 1 таблица - "support", и вторая - "support_messages".
Вот запрос:
Буду очень благодарен за помощь!
SELECT support.*, support_messages.message, COUNT(support_messages.message) AS messages_num, DATE_FORMAT(DATE, '%d.%m.%Y') AS date_time FROM support LEFT JOIN support_messages ON support.number_of_ticket = support_messages.number_of_ticket WHERE support.number_of_ticket = support_messages.number_of_ticket
Решение задачи: «Как правильно написать такой запрос?»
textual
Листинг программы
SELECT t1.active, t1.theme, t1.date, t1.number, t1.number_of_ticket, DATE_FORMAT(t1.date, '%d.%m.%Y') AS date_time, COUNT(t2.message) AS c_mes, GROUP_CONCAT(t2.message SEPARATOR '::') AS my_message, GROUP_CONCAT(t2.user_login SEPARATOR '::') AS who_answer FROM support AS t1 LEFT JOIN support_messages AS t2 ON t1.number_of_ticket = t2.number_of_ticket WHERE t1.user_login = '$my_login' GROUP BY number_of_ticket ORDER BY t1.number DESC
Объяснение кода листинга программы
Ваш запрос написан на SQL и выглядит следующим образом:
SELECT
- оператор выбора данных из базы данных.t1.active
,t1.theme
,t1.date
,t1.number
,t1.number_of_ticket
- это названия переменных, которые будут содержать значения выбранных столбцов.DATE_FORMAT(t1.date, '%d.%m.%Y')
- это функция форматирования даты, которая преобразует формат даты в 'день.месяц.год'.COUNT(t2.message)
- это функция подсчета количества значений в столбцеt2.message
.GROUP_CONCAT(t2.message SEPARATOR '::')
- это функция объединения значений из столбцаt2.message
в одну строку с использованием разделителя '::'.GROUP_CONCAT(t2.user_login SEPARATOR '::')
- это функция объединения значений из столбцаt2.user_login
в одну строку с использованием разделителя '::'.FROM support AS t1
- это указание, из каких таблиц брать данные и как их называть в запросе.LEFT JOIN support_messages AS t2 ON t1.number_of_ticket = t2.number_of_ticket
- это оператор объединения двух таблиц по указанному условию.$my_login
- это значение переменной, которое используется в условии WHERE для фильтрации данных.WHERE t1.user_login = '$my_login'
- это условие, которое фильтрует данные по значению переменной$my_login
.GROUP BY number_of_ticket
- это операция группировки данных по значению столбцаnumber_of_ticket
.ORDER BY t1.number DESC
- это указание, по какому столбцу следует упорядочить данные. Суммируя, запрос выбирает данные из таблицыsupport
и объединяет их с данными из таблицыsupport_messages
, затем фильтрует результаты по значению переменной$my_login
и упорядочивает их по номеру в порядке убывания.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д