2010-05-18 5 views
4

J'ai deux tableaux: photographies, et photo_tags. Photograph_tags contient une colonne appelée photograph_id (identifiant sur les photos). Vous pouvez avoir plusieurs tags pour une photo. J'ai une rangée de photos liée à trois étiquettes: garçon, ruisseau et eau. Toutefois, l'exécution de la requête suivante renvoie 0 lignesQuel est le problème avec cette requête SQL?

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 

Quelque chose ne va pas dans cette requête?

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 

Répondre

1

pour obtenir toutes les photos avec les 3 tags (ou plus) que vous avez spécifié. Commencez avec les tags et rejoignez les photos.

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 

tester le code ci-dessus.

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

Cette requête affiche plusieurs des mêmes lignes plusieurs fois – ThinkingInBits

+0

et certains qui n'ont pas tous les trois – ThinkingInBits

+0

@ThinkingInBits: là vous allez, mis à jour le sql de sorte que la photo doit avoir tous les tags –

0
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 
0

SELECT p * à partir de photographies p OÙ (c.value IN ('chien', 'eau', 'flux') ET (SELECTIONNER COMPTE (*) DE photograph_tags c
O WH c.photograph_id = p.id)> = 3;

vous donnera des photographies avec au moins trois étiquettes.

Questions connexes