Как правильно написать такой запрос? - 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 и выглядит следующим образом:

  1. SELECT - оператор выбора данных из базы данных.
  2. t1.active, t1.theme, t1.date, t1.number, t1.number_of_ticket - это названия переменных, которые будут содержать значения выбранных столбцов.
  3. DATE_FORMAT(t1.date, '%d.%m.%Y') - это функция форматирования даты, которая преобразует формат даты в 'день.месяц.год'.
  4. COUNT(t2.message) - это функция подсчета количества значений в столбце t2.message.
  5. GROUP_CONCAT(t2.message SEPARATOR '::') - это функция объединения значений из столбца t2.message в одну строку с использованием разделителя '::'.
  6. GROUP_CONCAT(t2.user_login SEPARATOR '::') - это функция объединения значений из столбца t2.user_login в одну строку с использованием разделителя '::'.
  7. FROM support AS t1 - это указание, из каких таблиц брать данные и как их называть в запросе.
  8. LEFT JOIN support_messages AS t2 ON t1.number_of_ticket = t2.number_of_ticket - это оператор объединения двух таблиц по указанному условию.
  9. $my_login - это значение переменной, которое используется в условии WHERE для фильтрации данных.
  10. WHERE t1.user_login = '$my_login' - это условие, которое фильтрует данные по значению переменной $my_login.
  11. GROUP BY number_of_ticket - это операция группировки данных по значению столбца number_of_ticket.
  12. ORDER BY t1.number DESC - это указание, по какому столбцу следует упорядочить данные. Суммируя, запрос выбирает данные из таблицы support и объединяет их с данными из таблицы support_messages, затем фильтрует результаты по значению переменной $my_login и упорядочивает их по номеру в порядке убывания.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4 из 5