Задавайте вопросы, мы ответим
Вы не зашли.
Такая задачка
table 1 (порядка 200к записей)
id name
table2 (соответственно, порядка 1млн записей)
id table1_id field2
Соответственно table1 и table2 соединяются по table1.id и table2.table1_id
Необходимо выбрать записи из первой таблицы по условию
(table2.id = 1 И table2.id = 3)
ИЛИ
(table2.id = 4 И table2.id = 5)
ИЛИ
(table2.id = 7 И table2.id = 9)
....
Помогите оптимизировать запрос :-) Пробовал subquery и join с group by
Неактивен
Вот например
select * from table1 inner join table2 on (table2.table1_id = table1.id and ( table2.id = 1 or table2.id = 2 ) ) group by table1.id having count(*) = 2
Это для одного условия И, соответственно чтобы объединить их Union?
select * from table1 inner join table2 on (table2.table1_id = table1.id and ( table2.id = 1 or table2.id = 2 ) ) group by table1.id having count(*) = 2 union select * from table1 inner join table2 on (table2.table1_id = table1.id and ( table2.id = 3 or table2.id = 4 ) ) group by table1.id having count(*) = 2
Пока чот не очень быстро пашет)
Второй вариант еще медленнее, что и логичнее, подзапросы
select * from table1 where ( select count(*) from table2 where table1.id = table1_id and table2.id = 1)>0 and select count(*) from table2 where table1.id = table1_id and table2.id = 2)>0 ) or ( select count(*) from table2 where table1.id = table1_id and table2.id = 3)>0 and select count(*) from table2 where table1.id = table1_id and table2.id = 4)>0 )
Неактивен
Сколько я понял, для одного «И» должны быть выбраны все элементы первой таблицы, которые соответствуют условию «table2.id = 1 И table2.id = 3» т.е.:
Неактивен
Да, спасибо, сам пришел к тому же, что стоит максимально избежать группировок и подзапросов.
Сейчас итоговый запрос просто монстр канеш.
Неактивен