• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Запрос Из Таблиц Один Ко Многим

  • Автор темы arvitaly
  • Дата начала
A

arvitaly

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

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
 
M

-master-

Необходимо выбрать записи из первой таблицы по условию
это неправильные условия, такого не бывает

учите как джойнить таблицы в запросах
 
A

arvitaly

Вот например

<!--shcode--><pre><code class='sql'>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[/CODE]

Это для одного условия И, соответственно чтобы объединить их Union?

<!--shcode--><pre><code class='sql'>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[/CODE]


Пока чот не очень быстро пашет)

Второй вариант еще медленнее, что и логичнее, подзапросы

<!--shcode--><pre><code class='sql'>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
)[/CODE]
 
M

-master-

это все можно записать как table2.id in (1,2,3,4)

Добавлено: что касается оптимизации то тут надо смотреть на планы
 
A

arvitaly

это все можно записать как table2.id in (1,2,3,4)

И внатуре, чо я распинаюсь пишу подзапросы, когда всего то взять условия задачи изменить и дело в шляпе
 
M

-master-

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

-master-

Код:
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 inner join table2 on table2.table1_id = table1.id
where table2.id in (1,2,3,4 ) group by table1.id having count(*) = 2
а тут?
а теперь расскажите что возвращают ваши запросы
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!