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

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

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

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

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

  • Автор темы byte255
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

byte255

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

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

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

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

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

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


пока делаю это вот таким вот страшным запросом:
Код:
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

Как бы это сделать по-другому?
 
V

VadikV

<!--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) - набор ид твоих признаков. сколько нужно, столько и запиши сюда.
 
A

acorn

byte255
только у Vadik опечатка, не lefy join, а left join.
 
B

byte255

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

LuMee

Вроде работает такой хитрый запрос:
<!--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.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

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