Что не так с этим запросом SQL? - PullRequest
4 голосов
/ 18 мая 2010

У меня есть две таблицы: фотографии и фотографии. Photograph_tags содержит столбец photos_id (идентификатор на фотографиях). Вы можете иметь много тегов для одной фотографии. У меня есть ряд фотографий, связанных с тремя метками: мальчик, ручей и вода. Однако выполнение следующего запроса возвращает 0 строк

SELECT p.*
FROM photographs p, photograph_tags c
WHERE c.photograph_id = p.id
AND (c.value IN ('dog', 'water', 'stream'))
GROUP BY p.id
HAVING COUNT( p.id )=3

Что-то не так с этим запросом?

My tables look like so
-----------------------
photographs
-----------------------
id | title | location
------------------------
7  | asdf | c:\...


-----------------------
photograph_tags
-----------------------
id | photograph_id | value
1  | 7             | dog
2  | 7             | water
3  | 7             | stream
4  | 7             | mountains

I want to pull all photograph rows that relate to at least all three of the searched tags

Ответы [ 3 ]

1 голос
/ 18 мая 2010

, чтобы получить все фотографии с 3 тегами (ИЛИ БОЛЬШЕ), которые вы указали. Начните с тегов и присоединяйтесь к фотографиям.

select
 p.id
from photographs p

left join photograph_tags c
on p.id = c.photograph_id
and c.value IN ('dog', 'water', 'stream')

group by p.id

having count(c.value) >= 3

тестирование вышеуказанного кода:

create table #photograph_tags (
    photograph_id INT,
    value varchar(50)
)

create table #photographs (
    id int
)

insert into #photographs values (7)
insert into #photographs values (8)

insert into #photograph_tags values (7, 'dog')
insert into #photograph_tags values (7, 'water')
insert into #photograph_tags values (7, 'stream')
insert into #photograph_tags values (7, 'mountains')
insert into #photograph_tags values (8, 'stream')
insert into #photograph_tags values (8, 'mountains')

select * from #photographs
select * from #photograph_tags

select
    p.id
from #photographs p

left join #photograph_tags c
on p.id = c.photograph_id
and c.value IN ('dog', 'water', 'stream')

group by p.id

having count(c.value) >= 3


drop table #photograph_tags
drop table #photographs
0 голосов
/ 18 мая 2010

ВЫБРАТЬ стр. * ИЗ фотографий р ГДЕ (c.value IN («собака», «вода», «поток»)) И (ВЫБЕРИТЕ СЧЕТЧИК (*) FROM photos_tags c
ГДЕ c.photograph_id = p.id)> = 3;

предоставит вам фотографии как минимум с тремя тегами.

0 голосов
/ 18 мая 2010
SELECT p.* FROM photographs p join 
(select id, COUNT(id) as TagCount 
    FROM Photograph_Tags c
    WHERE c.value IN ('dog', 'water', 'stream')
    group by id) 
    as TagCounts on p.id = TagCounts.id
WHERE TagCount = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...