我有一个项目表,标签表和连接这两个(多对多)的表。
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中手动解析数据吗?
考虑到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)它不应该。怎么做这个部分?
答案 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
)
唯一的问题是它长而且效率低下。就像我说的那样,当我不在手机上时,我会做出改进。