关联表方案中的多标记搜索

时间:2010-09-19 06:42:55

标签: php mysql tags

我正在使用您的标准三表标签设置

item_table
 item_id
 item_name

tag_table
 tag_id
 tag_name

tag_map
 map_id
 tag_id
 item_id

对于那些使用类似方案进行标记体系结构的人来说,这是如何工作的,现在,使用这个方案我有一个场景,我需要打印item_table的结果,匹配多个标签,这意味着他们必须将每个标签用于匹配并打印项目表中的项目,这在理论上就像这样写了

SELECT i.item_id, i.item_name, t.tag_id, t.tag_name, m.tag_id, m.item_id FROM item_table AS i
JOIN tag_table AS t ON t.tag_id = m.tag_id
JOIN tag_map AS m ON m.item_id = i.item_id
WHERE t.tag_name = 'tag_one'
AND t.tag_name = 'tag_two'

所需的输出类似于

第1项(因为第1项的记录在标签图中分配了tag_one和tag_two) 第2项(同上) (但不是第3项,因为它只有tag_one,或者没有标签)

当然我知道这不起作用,为什么,我只是提供了错误的例子来突出我想要完成的事情。

提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

尝试

SELECT i.item_id, i.item_name, t.tag_id, t.tag_name, m.tag_id, m.item_id 
FROM item_table AS i
JOIN tag_map AS m ON m.item_id = i.item_id
JOIN tag_table AS t ON t.tag_id = m.tag_id AND t.tag_name IN('tag1','tag2')
WHERE m.map_id NOT IN (SELECT m1.map_id FROM tag_map m1,item_table i1, tag_table t1
WHERE m1.item_id = i1.item_id AND m1.tag_id = t1.tag_id AND t1.tag_name IN('tag1','tag2')
GROUP BY m1.item_id HAVING COUNT(m1.item_id) <2)