Вывод группы записей, если условие выполняется хотя бы с одной записью из группы - MySQL
Формулировка задачи:
Из базы данных со связью "многие ко многим" выбираю таблицу с сообщениями, соединённую с таблицей адресов, по которому каждое сообщение было разослано. Использую GROUP_CONCAT()
На выходе запрос выдаёт таблицу вот такого формата
Мне необходимо делать выборку по Адресу, например вывести все сообщение адресованные на Москву, но при указании такого условия в WHERE в столбце "Адреса" будет выводиться только Москва
Возможно ли получить выборку сообщений по адресу, но при этом вывести все адреса, куда эти сообщения отправлены?
PS. Все примеры, в том числе и SQL запрос мною придуманы прямо сейчас, дабы как можно лучше передать суть проблемы
НО поиск с помощью строковой функции хоть и работает как мне надо, немного кажется мне не совсем правильным...
Может быть всё таки есть нормальный вариант?
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
Отправитель | Сообщение | Адреса |
Иванов Иван Иванович | Привет всем | Ростов, Москва, Иваново |
Петров Пётр Петрович | Ещё одно сообщение | Москва, Киров, Иваново |
Козлов Вася | Третье сообщение | Ростов, Петербург |
Отправитель | Сообщение | Адреса |
Иванов Иван Иванович | Привет всем | Москва |
Петров Пётр Петрович | Ещё одно сообщение | Москва |
Попробовал похимичить с 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
, объединённая из строк в одну строку с разделителем запятая.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д