Правильный выбор записей обладающих рядом признаков одновременно. Как

Тема в разделе "SQL", создана пользователем byte255, 24 авг 2011.

Статус темы:
Закрыта.
  1. byte255

    byte255 Гость

    Здравствуйте, уважаемые программисты!

    Подскажите пожалуйста начинающему.
    Есть таблица предметов (игрушки)
    id name
    1 toy_1
    2 toy_2
    ....

    аналогичная таблица признаков (id, name)

    и связывающая их в отношении многие ко многим таблица
    binder

    Код (Text):
    toy_id, attr_id
    1        1
    2        1
    3        1
    4        1
    2        3
    2        4
    Мне нужно выбрать предметы,
    соответствующие одновременно несколько признакам

    (например предмет может быть одновременно деревяным, круглым и зеленым)


    пока делаю это вот таким вот страшным запросом:
    Код (Text):
    SELECT q1.id, q1.name FROM

    ( SELECT DISTINCT bind.toy_id as id,
    t.name, bind.attr_id
    FROM binder as bind, toys as t
    WHERE bind.toy_id = t.id
    AND  ( bind.attr_id = '4')
    ) as q1,

    ( SELECT DISTINCT bind.toy_id as id, bind.attr_id
    FROM binder as bind, toys as t
    WHERE bind.toy_id = t.id
    AND  ( bind.attr_id = '1')
    ) as q2,

    ( SELECT DISTINCT bind.toy_id as id, bind.attr_id
    FROM binder as bind, toys as t
    WHERE bind.toy_id = t.id
    AND  ( bind.attr_id = '3')
    ) as q3

    WHERE q2.id = q1.id AND q3.id = q1.id
    Как бы это сделать по-другому?
     
  2. VadikV

    VadikV Member

    Регистрация:
    10 ноя 2010
    Сообщения:
    17
    Симпатии:
    0
    <!--shcode--><pre><code class='sql'>select игрушки.id, игрушки.name, признак.name as p_name
    from binder
    lefy join игрушки on (игрушки.id = binder.toy_id)
    lefy join признак on (признак.id = binder.attr_id)
    where binder.attr_id in (1,10,45)[/CODE]

    вот это (1,10,45) - набор ид твоих признаков. сколько нужно, столько и запиши сюда.
     
  3. acorn

    acorn PHP Developer

    Регистрация:
    29 авг 2004
    Сообщения:
    599
    Симпатии:
    3
    byte255
    только у Vadik опечатка, не lefy join, а left join.
     
  4. byte255

    byte255 Гость

    Увы, выводит четыре игрушки, а должно только вторую, т к только она обладает
    одновременно признаками 1, 4 и 3.
     
  5. LuMee

    LuMee Well-Known Member

    Регистрация:
    2 май 2006
    Сообщения:
    477
    Симпатии:
    0
    Вроде работает такой хитрый запрос:
    <!--shcode--><pre><code class='sql'>SELECT * FROM toys
    WHERE id NOT IN (
    SELECT t.id
    FROM
    toys AS t
    CROSS JOIN attributes AS a
    LEFT JOIN binder AS b ON a.attr_Id = b.attr_Id AND b.toy_id = t.Id
    WHERE b.toy_id IS NULL AND a.attr_id IN (1, 3, 4)
    )[/CODE]
    Здесь attributes - таблица со всеми возможными аттрибутами.
    Идея запроса, думаю, понятна: выбираем все игрушки, кроме тех, у которых отсутствует хотя бы один из аттрибутов 1, 3, 4.
     
Загрузка...
Статус темы:
Закрыта.

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