mysql HAVING组有多个LIKE条件?

时间:2013-12-03 11:17:53

标签: mysql sql having

我有一个项目列表,每个项目都包含与标签列表相关的内容。

我可以通过过滤标记来检索这些项目:

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"); 

1 个答案:

答案 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