Ne bu SQL sorgusu ile yanlış?

2 Cevap php

Fotoğraf ve photograph_tags: İki tablo var. Photograph_tags (Fotoğraflarda id) photograph_id adında bir sütun içerir. Bir fotoğraf için birçok etiket olabilir. Çocuk, dere ve su: Ben üç etiketler ile ilgili bir fotoğraf satır var. Ancak, aşağıdaki sorguyu çalıştıran 0 satır döndürür

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

Bu sorgu ile yanlış bir şey mi?

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

2 Cevap

Eğer belirtilen 3 etiketleri (veya daha fazla) tüm fotoğrafları almak için. Etiketler ile başlayın ve fotoğrafları katılın.

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

Yukarıdaki kodu test:

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

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

en az üç etiketleri ile size fotoğraf verecektir.