Вывод группы записей, если условие выполняется хотя бы с одной записью из группы - MySQL

Узнай цену своей работы

Формулировка задачи:

Из базы данных со связью "многие ко многим" выбираю таблицу с сообщениями, соединённую с таблицей адресов, по которому каждое сообщение было разослано. Использую GROUP_CONCAT()
SELECT message.name, message.message, GROUP_CONCAT(address.city SEPARATOR ', ') 
FROM message_address INNER JOIN message INNER JOIN address
ON message_address.message_id = message.id AND message_address.address_id = address.id
GROUP BY message.id
На выходе запрос выдаёт таблицу вот такого формата
Отправитель Сообщение Адреса
Иванов Иван Иванович Привет всем Ростов, Москва, Иваново
Петров Пётр Петрович Ещё одно сообщение Москва, Киров, Иваново
Козлов Вася Третье сообщение Ростов, Петербург
Мне необходимо делать выборку по Адресу, например вывести все сообщение адресованные на Москву, но при указании такого условия в WHERE в столбце "Адреса" будет выводиться только Москва
Отправитель Сообщение Адреса
Иванов Иван Иванович Привет всем Москва
Петров Пётр Петрович Ещё одно сообщение Москва
Возможно ли получить выборку сообщений по адресу, но при этом вывести все адреса, куда эти сообщения отправлены? PS. Все примеры, в том числе и SQL запрос мною придуманы прямо сейчас, дабы как можно лучше передать суть проблемы
Попробовал похимичить с HAVING, пытался проверять по address.id, но ничего не вышло, путём перебора вариантов найден рабочий:
SELECT message.name, message.message, GROUP_CONCAT(address.city SEPARATOR ', ') AS Address
FROM message_address INNER JOIN message INNER JOIN address
ON message_address.message_id = message.id AND message_address.address_id = address.id
GROUP BY message.id
HAVING LOCATE('Москва', Address);
НО поиск с помощью строковой функции хоть и работает как мне надо, немного кажется мне не совсем правильным... Может быть всё таки есть нормальный вариант?

Решение задачи: «Вывод группы записей, если условие выполняется хотя бы с одной записью из группы»

textual
Листинг программы
SELECT message.*, GROUP_CONCAT(address.city SEPARATOR ', ') AS Address 
FROM message_address AS ma 
RIGHT JOIN message ON(ma.message_id = message.id) 
LEFT JOIN address ON(ma.address_id = address.id) 
WHERE EXISTS (SELECT * FROM message_address WHERE message_address IN(1, 5) AND message_id = message.id) 
GROUP BY message.id

Объяснение кода листинга программы

В представленном коде выполняется следующая задача: выводится группа записей из таблицы message, если условие выполняется хотя бы с одной записью из группы. В условии используется подзапрос, который выбирает записи из таблицы message_address, где message_id равно id из таблицы message и message_address IN(1,5). Затем результаты группируются по id из таблицы message. В качестве результата выводится информация из таблицы message и дополнительная информация из таблицы address, объединённая из строк в одну строку с разделителем запятая.

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


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

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

10   голосов , оценка 4.1 из 5
Похожие ответы