2012-07-01 99 views
1

我有一个带有3个表格的内容数据库,我需要根据标签查询来获取内容。mysql query按标签选择

的表是这样的:

nv_entries: 
id - title - year - etc.. 

nv_tags: 
id - entrieid - tag 

nv_images: 
id - entrieid - source 

比方说,我想,有标签“卢梭”,并在其中既有“模糊”的所有条目。 之后,图像应该加入以及entrieid = entrieid。

这可能可以完成一个查询,但我不知道如何。

$query = "SELECT * from nv_entries WHERE ??? 

请帮助

回答

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。

+0

这是行不通的。 tags.tag不能同时等于rousseau和fuzz。 SQL一次处理一行。 –

+0

@RC:你说得对! 请更正此问题。告诉这个工作?如果没有工作,然后使用tags.tag IN('rousseau','fuzz')。 PS: 一位用户发布了一个具有相同IN条件的答案,但我说他错了,他删除了答案。我为他感到难过。你可以包括你的答案。 –

+0

如果使用更多标签(或者只是1个),该怎么办? – clankill3r

1

由于条目和标签之间有一对多关系,因此必须在标签表上使用数据透视表。简单地说,标记='x'和标记='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); 
+0

如果使用其他标签或使用3个​​标签/ 4标签,这是非常困难的。任何解决方案? – clankill3r

+0

获取条目的次数是多少,并查看一下php的载入次数是多少次,如果它等于标签的数量,那么保存它? – clankill3r

+0

我不清楚你在评论中关于“获得双倍奖品”的说法。就困难而言,您可以使查询更通用,并动态构建SQL以提供正在搜索的正确数量的值。 (尽管使用绑定变量传递实际值) –