我有一个项目列表,每个项目都包含与标签列表相关的内容。
我可以通过过滤标记来检索这些项目:
HAVING (GROUP_CONCAT(tag.name) LIKE '%$tag%')
因此,“ITEM x”的 tag.names 列表可能是:鞋子,凉鞋,鞋跟,黑色,漂亮
我正在搜索的 $ tag 是:“鞋” - 这会给我“ITEM x”。
但是当用户搜索超过1个单词的标签时会发生什么?即。 “漂亮的黑鞋”。上述条件不会产生结果。
我知道我可以将每个单词分解为具有单独的术语,但是我该怎么做呢?:
HAVING (GROUP_CONCAT(tag.name) LIKE '%$tag1%' OR GROUP_CONCAT(tag.name) LIKE '%$tag2%' OR GROUP_CONCAT(tag.name) LIKE '%$tag3%')
$ tag1 =很好, $ tag2 =黑色, $ tag2 =鞋
在我看来,定义GROUP_CONCAT x次(示例中为3次)可能有点消耗?
有什么想法吗?
请注意我使用“ HAVING ”而不是“ WHERE ”。
谢谢!
更新:发布完整查询:
$query = mysql_query("SELECT i.id
, SUBSTRING_INDEX(GROUP_CONCAT(t.name ORDER BY t.stats_items DESC), ',', 3) as tagList
FROM items AS i
LEFT JOIN tag_rel AS tr ON (tr.item = i.id)
LEFT JOIN tags AS t ON (t.id = tr.tag)
GROUP BY i.id
HAVING (GROUP_CONCAT(t.name) LIKE '$tag%')
ORDER by i.DESC LIMIT 0, 120");
答案 0 :(得分:2)
更清洁的方法是不搜索字符串
HAVING sum(tag.name = 'nice') > 0
AND sum(tag.name = 'black') > 0
AND sum(tag.name = 'shoes') > 0
或
WHERE tag.name in ('nice','black','shoes')
HAVING count(distinct tag.name) = 3