возможно ли уменьшить количество запросов?

number1215

Новичок
возможно ли уменьшить количество запросов?

данные:
======
существует n-ное чиcло таблиц (в примере - 3) и реестр в котором сложены id'шники всех таблиц (id'шники "сквозные")

table1
--------
id; name
1; 'x1'
2; 'x2'

table2
--------
id; name
3; 'x3'
5; 'x5'
7; 'x7'

table3
--------
id; name
9; 'x9'

reestr
--------
id; tableName
1; table1
2; table1
3; table2
4; table2
5; table2
6; table2
7; table2
8; table3
9; table3


задача:
======
нужно получить из реестра те id, которых нет в соответсвующей таблице

существующее решение:
===================
1. вытащить все записи из таблицы reestr в массив a1
2. в цикле проходим по каждой записи из a1 и делам select в соответстующую таблицу ... если такая запись есть, id - существуюет, в противном случае - не существует

нужное решение:
=============
при большом количестве записей в таблицах получается слишком много запросов, возможно ли уменьшить количество запросов?
 

moxnatiy

Новичок
зачем сделан реестр? непонятно для чего так спроектированы таблицы.
 

number1215

Новичок
Автор оригинала: moxnatiy
зачем сделан реестр? непонятно для чего так спроектированы таблицы.
... вопрос не в том почему так (тут уж ничего не поделаешь) - это условие задачки, а вопрос как решить эту задачку? :)
 

Falc

Новичок
number1215
Если критично кол-во запросов, то можно вытащить данные из таблиц и реестра в массивы и сравнивать уже массивы.

Наличие подобного реестара наталкивает на мысль что дынные из таблиц table1, table2, table3 следует объеденить в одну.

-~{}~ 12.12.05 13:50:

Gas
Данный запрос не учитывает всех таблиц и поле tableName
 

number1215

Новичок
Автор оригинала: Falc
number1215
Если критично кол-во запросов, то можно вытащить данные из таблиц и реестра в массивы и сравнивать уже массивы.

Наличие подобного реестара наталкивает на мысль что дынные из таблиц table1, table2, table3 следует объеденить в одну.
угу, насчет вытащить все в память - это мудро... если лучшего решения не будет - буду использовать это :)

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

... таблицы не нужно объединять в одну - там своя система и она работает как нужно ... просто я для этого примера выкинул из них все лишнее и оставил только необходимое
 

Falc

Новичок
number1215
>>но, возможно, использовать какой-нибудь хитрый join для этих целей?

Для такого джойна нужен динамический SQL, MySQL такого не умеет.

-~{}~ 12.12.05 14:48:

Gas

Сори не заметил "reestr.tableName = 'table1'" в твоем запросе.

Тогда уж правильнее писать:
Код:
SELECT reestr.id
FROM reestr
LEFT JOIN table1 ON reestr.id = table1.id
WHERE table1.id IS NULL AND reestr.tableName = 'table1';
number1215
Можно сделать на каждую таблицу по такому запрсосу.
 

number1215

Новичок
Автор оригинала: Falc
Для такого джойна нужен динамический SQL, MySQL такого не умеет.

Код:
SELECT reestr.id
FROM reestr
LEFT JOIN table1 ON reestr.id = table1.id
WHERE table1.id IS NULL AND reestr.tableName = 'table1';
Можно сделать на каждую таблицу по такому запрсосу.
такими запросами не получится - в БД много таблиц и не все из них мне нужны, поэтому идти нужно не от таблиц, а от реестра .... буду делать через "массивы в памяти" ... :)

всем большое спасибо!

жаль, что нельзя вытащить id'шники одним запросом через "хитрый" join :(
 

Falc

Новичок
number1215
>>БД много таблиц и не все из них мне нужны

Так ты пишешь запросы только на те таблицы, которые тебе нужны
 

number1215

Новичок
Falc

не знаю, в принципе можно, взять столбец DISTINCT tableName FROM reestr - это как раз и будет список нужных мне таблиц и для каждой из них выполнить запрос ... вообщем, сейчас подумаю какой вариант реализовывать ... :)
 
Сверху