我有一个包含3个内容表的数据库,我需要根据标签查询获取内容。
表格如下:
nv_entries:
id - title - year - etc..
nv_tags:
id - entrieid - tag
nv_images:
id - entrieid - source
假设我想要所有带有“rousseau”标签和“fuzz”的条目。 之后,图像应该连接到entrieid = entrieid。
这可以通过一个查询完成,但我不知道如何。
$query = "SELECT * from nv_entries WHERE ???
请帮助
答案 0 :(得分:1)
由于条目和标记之间存在一对多关系,因此必须在标记表上使用数据透视表。简单地说tag ='x“和tag ='y”的位置不起作用,因为引擎会逐行查看,因此标签不能同时具有这两个值。所以基本上你转动,为每个条目分配标志,说明该条目是否被认为具有你正在寻找的标签值。
SELECT *
FROM nv_entries entries
JOIN (
SELECT entrieid,
COUNT(CASE WHEN (tag = 'rousseau') THEN 1 ELSE null END) has_rousseau,
COUNT(CASE WHEN (tag = 'fuzz') THEN 1 ELSE null END) has_fuzz
FROM nv_tags
GROUP BY entrieid
HAVING has_rousseau != 0 and has_fuzz != 0
) tags ON (entries.id = tags.entrieid)
JOIN nv_images images ON (tags.entrieid = images.entrieid);
答案 1 :(得分:0)
SELECT * FROM
nv_entries entries
INNER JOIN nv_tags tags ON tags.entrieid = entries.id
INNER JOIN nv_images imgs ON imgs.entrieid = entries.id
WHERE tags.tag IN('rousseau','fuzz')
但这将从三个表中提取所有数据。 指定相对于表的标记,以避免冗余标记为entrieid。