Объединить JOINS или написать рекурсивную функцию - проблема с динамическим числом запросов JOIN - PullRequest
1 голос
/ 15 января 2010

Мне нужно решить следующую проблему:

Допустим, есть таблица A, которая содержит несколько элементов, эта таблица копируется, чтобы стать таблицей B. В таблице B некоторые из исходных элементов утеряны, а некоторые добавлены. Справочная таблица AB отслеживает эти изменения. Затем таблица B копируется в таблицу C, и снова некоторые из существующих элементов теряются, а некоторые добавляются. Другая справочная таблица BC отслеживает эти отношения. ... и т. д.

Существует n таких таблиц с n-1 числом справочных таблиц.

Если я хочу узнать, какой из элементов моего выбора в таблице C уже присутствует в A, я могу сделать это, выполнив что-то вроде:

SELECT AB.oldID
FROM AB
JOIN BC
WHERE BC.newID IN (x, y, z)

Теперь, поскольку количество ссылочных таблиц может быть осторожным, количество строк JOIN может быть осторожным.

Должен ли я объединять запрос, циклически повторяя шаги и добавляя строки JOIN или shoudl. Я лучше напишу рекурсивную функцию, которая выбирает только элементы следующего шага, а затем позволяет функции вызывать саму себя, пока у меня не будет конечного результата?

Или есть другой, еще лучший способ сделать что-то подобное?

1 Ответ

1 голос
/ 15 января 2010

Поскольку имена ваших таблиц различаются, вам нужно создать динамический запрос.

Если вы применяете рекурсивный подход к функциям, вам нужно как-то передавать наборы результатов между вызовами функций.

MySQL не имеет типа данных массива, и сохранение результатов во временной таблице слишком длинное.

Вывод: используйте соединения.

Обновление:

Вот пример запроса, который возвращает записи, сохранившиеся до версии A, до версии M (с одним дизайном таблицы):

SELECT  *
FROM    entries e
WHERE   NOT EXISTS
        (
        SELECT  *
        FROM    revisions r
        JOIN    revision_changes rc
        ON      rc.revision_id = r.id
        WHERE   rc.entry_id = e.id
                AND rc.deleted
                AND r.revision_id BETWEEN 'A' AND 'M'
        )

Таким образом, вы просто заполняете поля added и deleted revision_changes для ревизий, в которые запись была добавлена ​​или удалена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...