SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 22.02.2013 09:14:36

arvitaly
Участник
Зарегистрирован: 08.09.2010
Сообщений: 4

Запрос из таблиц один ко многим

Такая задачка

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

Неактивен

 

#2 22.02.2013 10:50:18

arvitaly
Участник
Зарегистрирован: 08.09.2010
Сообщений: 4

Re: Запрос из таблиц один ко многим

Вот например

Код:

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
)

Неактивен

 

#3 22.02.2013 12:32:23

Александр Трофимов
Завсегдатай
Откуда: Юрмала
Зарегистрирован: 19.09.2011
Сообщений: 95

Re: Запрос из таблиц один ко многим

Сколько я понял, для одного «И» должны быть выбраны все элементы первой таблицы, которые соответствуют  условию «table2.id = 1 И table2.id = 3» т.е.:

SELECT
    id,
    name
FROM
    table1 t1
    JOIN table2 t2 ON (t2.table1_id=t1.id)
    JOIN table2 t3 ON (t3.table1_id=t1.id)
WHERE
    t2.id=1
    AND t3.id=3


Из этого следует, что для все остальных «И» я бы использовал UNION, т.е.:

SELECT
    id,
    name
FROM
    table1 t1
    JOIN table2 t2 ON (t2.table1_id=t1.id)
    JOIN table2 t3 ON (t3.table1_id=t1.id)
WHERE
    t2.id=1
    AND t3.id=3
UNION SELECT
    id,
    name
FROM
    table1 t1
    JOIN table2 t2 ON (t2.table1_id=t1.id)
    JOIN table2 t3 ON (t3.table1_id=t1.id)
WHERE
    t2.id=4
    AND t3.id=5
UNION SELECT
    id,
    name
FROM
    table1 t1
    JOIN table2 t2 ON (t2.table1_id=t1.id)
    JOIN table2 t3 ON (t3.table1_id=t1.id)
WHERE
    t2.id=7
    AND t3.id=9

...

Неактивен

 

#4 22.02.2013 13:09:54

arvitaly
Участник
Зарегистрирован: 08.09.2010
Сообщений: 4

Re: Запрос из таблиц один ко многим

Да, спасибо, сам пришел к тому же, что стоит максимально избежать группировок и подзапросов.

Сейчас итоговый запрос просто монстр канеш.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson