Mysql查询,item包含所有指定的标签

时间:2010-12-18 19:04:27

标签: php mysql

我有一个项目表,标签表和连接这两个(多对多)的表。

Fields of each table:
 items:
    id_item INT

 tags:
    id_tag INT

 item_tag:
    id_item INT
    id_tag INT

现在每个项目都可以有一个或多个标签。我想执行基于标记的搜索,它将仅选择包含指定标记的这些项目。因此,如果我有带标签FLASH (id=1), PHP(id=2), MYSQL(id=3), RAGE(id=4)的项目,我可以在搜索时找到它:

FLASH, [1] (This is an array of tag ID's)
FLASH + PHP, [1,2]
MYSQL + PHP + RAGE, [3,2,4]
PHP + FLASH + MYSQL + RAGE [2,1,3,4]

但是我应该找到它,例如:

ACTIONSCRIPT, [8]
PHP + ACTIONSCRIPT, [2,8]

我想过使用简单的LEFT JOIN和IN(...)然后我意识到它不起作用......任何提示?它可以通过Mysql查询完成而无需在PHP中手动解析数据吗?

UPDATE:

考虑到Brad Christie的回答,这是一个问题的示例查询:

SELECT t1.some_field, GROUP_CONCAT(t2.id_tag ORDER BY t2.id_tag) AS tagList FROM items t1
LEFT JOIN item_tag t2 ON t1.id_item = t2.id_item
WHERE HERE_LIES_THE_PROBLEM

现在,我们 HERE_LIES_THE_PROBLEM 应该是一个检查 X 中显示的所有元素是否都在 tagList 中的函数。因此,如果 tagList 是“1,2,3,4”而 X 是“1,2”,它应该可以工作,但是如果 X 是(1,2,5)它不应该。怎么做这个部分?

1 个答案:

答案 0 :(得分:2)

this previous SO question是否有帮助?

修改

此外,在PHP中连接查询并使用AND包含所有搜索字词有什么问题?

<强> EDITV2

请原谅我在手机上这样做。正如我所说的那样,当我有机会时,我会发布一个更好的解决方案。但是,如下所示,虽然很长,但应该有效:

SELECT *
FROM items
WHERE id_item IN (
  SELECT item_tag.id_item
  FROM item_tag
    INNER JOIN tags
    ON tags.id_tag = item_tag.id_tag
  WHERE tags.tag_name='PHP'
  )
  AND id_item IN (
    --- same as above, just different tag
  )

唯一的问题是它长而且效率低下。就像我说的那样,当我不在手机上时,我会做出改进。