MySQL и PHP: поиск строк по полю в неопределенном количестве объединенных таблиц - PullRequest
0 голосов
/ 17 декабря 2010

Существует пример таблицы 'main_table' с полями 'ID', 'some_data'.

Существует таблица агрегирования 'agg' с полями 'id', 'main_table_id', 'joinee_id '.

И, наконец, есть последняя таблица' joinee 'с полями' id ',' email '.

Таблицы' main_table 'и' joinee 'находятся вотношения многие: многие, через 'agg'.

Я хотел бы иметь возможность искать все записи 'main_table' по 'email' от 'joinee', не делая левого соединения, а затем группировать по 'main_table''.'Я бы'.Конечный результат должен перечислить все записи 'main_table', по одному разу для каждой записи.Представьте себе это так - я бы хотел, чтобы main_table получил временное поле «участники», которое будет содержать все «электронные письма», - тогда я бы выполнил LIKE-совпадение с этим полем в том же запросе, который делает это, чтобы найтизаписи 'main_table', которые имеют какое-либо отношение к введенному мною электронному письму.

Возможно ли это?

Имейте в виду, это только фрагмент гораздо большего запроса.'main_table' уже объединен с 5 другими таблицами, и их поля уже используются в качестве фильтров.Дело в том, что я знаю, что в каждом из этих случаев может быть только одна объединенная таблица - с «joinee» количество подключенных записей варьируется.

Спасибо.

1 Ответ

1 голос
/ 17 декабря 2010

Объединение результатов строк в отдельные ячейки - это то, что реляционная модель не поддерживает, и большинство СУБД в этом исключительно плохи.Если бы вы пошли по этому пути, вам понадобилось бы немало взломать, например, использовать пользовательские функции или нестандартные синтаксические функции для объединения значений.

Но если я вас правильно понимаю, вашпроблема в том, что вам нужно найти записи в основной таблице, которые имеют желаемые записи в соответствующих строках электронной почты, а проблема в том, что существует отношение «многие ко многим».

Как насчет этого:

  1. Напишите запрос, который найдет email s, которые вас интересуют, и inner join, что в таблице agg.Это даст вам связанные main_table_id s.Используйте distinct или group by для удаления двойных чисел.
  2. Используйте запрос из 1 в качестве подзапроса и вставьте его в запрос, как он есть сейчас, используя что-то вроде WHERE main_table.id IN (/* subquery */) или, альтернативно,inner join ваш существующий запрос в подзапросе из шага 1. Какой из них вы используете, зависит от обстоятельств;Традиционно подзапросы выполняются медленнее, чем объединения (при прочих равных условиях), но это может быть наоборот, в зависимости от вашей структуры и фактических данных.На некоторых старых DMBS буферизация результата подзапроса во временную таблицу может оказаться полезной.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...