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

Тема в разделе "SQL", создана пользователем arvitaly, 22 фев 2013.

  1. arvitaly

    arvitaly New Member

    Регистрация:
    13 апр 2009
    Сообщения:
    4
    Симпатии:
    0
    Такая задачка

    Соответственно table1 и table2 соединяются по table1.id и table2.table1_id
    Необходимо выбрать записи из первой таблицы по условию

    Помогите оптимизировать запрос :) Пробовал subquery и join с group by
     
  2. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    это неправильные условия, такого не бывает

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

    arvitaly New Member

    Регистрация:
    13 апр 2009
    Сообщения:
    4
    Симпатии:
    0
    Вот например

    <!--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]
     
  4. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    это все можно записать как table2.id in (1,2,3,4)

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

    arvitaly New Member

    Регистрация:
    13 апр 2009
    Сообщения:
    4
    Симпатии:
    0
    И внатуре, чо я распинаюсь пишу подзапросы, когда всего то взять условия задачи изменить и дело в шляпе
     
  6. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    про что вы говорите не совсем понятно.
    кто вас знает, зачем вы эти подзапросы пишите, может такая у вас к ним любовь...
     
  7. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    18
    Код (Text):
    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
    сколько тут возхвращается записей?
    Код (Text):
    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
    а тут?
    а теперь расскажите что возвращают ваши запросы
     
Загрузка...

Поделиться этой страницей