Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос из таблиц один ко многим 
:(
    Опции темы
arvitaly
  Дата 22.2.2013, 08:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.10.2009

Репутация: нет
Всего: нет



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

Цитата
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)
....


Помогите оптимизировать запрос smile Пробовал subquery и join с group by
PM MAIL WWW   Вверх
Zloxa
Дата 22.2.2013, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(arvitaly @  22.2.2013,  09:31 Найти цитируемый пост)
Помогите оптимизировать запрос

в вашем посте запрос не найден, оптимизировать нечего smile


Цитата(arvitaly @  22.2.2013,  09:31 Найти цитируемый пост)
(table2.id = 1 И table2.id = 3)
ИЛИ
(table2.id = 4 И table2.id = 5)
ИЛИ
(table2.id = 7 И table2.id = 9)
....

Если это where conidion, эту конструкцию можно переписать так:
Код

where 1=2

При полной эквивалентности, уверен, будет намного быстрее работать smile

Это сообщение отредактировал(а) Zloxa - 22.2.2013, 09:07


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
arvitaly
Дата 22.2.2013, 09:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 7.10.2009

Репутация: нет
Всего: нет



Вот например

Код
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
)

PM MAIL WWW   Вверх
Zloxa
Дата 22.2.2013, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(arvitaly @  22.2.2013,  10:21 Найти цитируемый пост)
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

Код

select * 
from table1
where id in (select table2.table1_id
               from table2
               where table2.id in (1,2)
               group by table1_id
               having count(distinct table2.id) = 2
            )

индекс, по table2.id, table1.id, надеюсь есть?

Это сообщение отредактировал(а) Zloxa - 22.2.2013, 09:35


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0492 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.