使用 LIKE 运算符而不限制结果

Posted

技术标签:

【中文标题】使用 LIKE 运算符而不限制结果【英文标题】:Using LIKE operator without limiting results 【发布时间】:2013-12-01 23:59:38 【问题描述】:

我有以下查询,其目的是显示包含一系列“标签”的“项目”列表。此外,我选择为每个“项目”仅显示“5”个标签,如下所示:

$query = mysql_query("SELECT i.*, 
                SUBSTRING_INDEX(GROUP_CONCAT(t.name), ',', 5) 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"); 

好的,那太好了。它给了我这样的东西:

[项目1]标签1,标签2,标签3,标签6,标签8

[项目2]标签1,标签3,标签11,标签15,标签16

[项目3]标签2,标签4,标签5,标签6,标签7

但事情是这样的:如果想通过添加“tag2”来显示“项目”列表:

WHERE (t.name LIKE 'tag2')

我的结果很简单:

[项目 1] tag2

[项目 3] tag2

向我展示实际上标有“tag2”但“标签”仅限于该标签的项目。结果,我真正想要的是这两个项目(标记为“tag2”的项目)及其所有标签:

[项目1]标签1,标签2,标签3,标签6,标签8

[项目 3] tag2,tag4,tag5,tag6,tag7

我试过用

WHERE (tagList LIKE '%tag2%')

但这只是给了我:

Invalid query: Unknown column 'tagList' in 'where clause'

我希望我说清楚了。非常感谢!

【问题讨论】:

请添加您数据库的简短示例转储,以便其他人可以使用它来尝试答案。 【参考方案1】:

您错过了 MySQL 执行 Query 的顺序。一般来说,它首先执行FROM ... JOIN ... 子句,然后是WHERE 子句,然后是SELECT。因此,在SELECT 子句中创建的别名不能在WHERE 子句中使用。

【讨论】:

真的,对不起。我没有在示例中包含它:(【参考方案2】:

您可以使用 HAVING 而不是 WHERE 来做到这一点

SELECT i.*, 
    SUBSTRING_INDEX(GROUP_CONCAT(t.name), ',', 5) 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 (tagList LIKE '%tag2%')

如果你想搜索所有标签(不仅仅是前 5 个),你可以通过 JOIN-ing 标签再一次来做到这一点:

SELECT i.*, 
    SUBSTRING_INDEX(GROUP_CONCAT(t.name), ',', 5) tagList
FROM items AS i
JOIN tag_rel as tr2 ON (tr2.item = i.id)
JOIN tags as t2 ON (t2.id = tr2.tag)
LEFT JOIN tag_rel AS tr ON (tr.item = i.id)
LEFT JOIN tags AS t ON (t.id = tr.tag)
WHERE t2.name = 'tag2'
GROUP BY i.id

或与另一个GROUP_CONCAT

SELECT i.*, 
    SUBSTRING_INDEX(GROUP_CONCAT(t.name), ',', 5) 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 '%tag2%')

您还应该知道LIKE 解决方案也将匹配“tag2”、“tag21”、“myTag2”...等。

【讨论】:

这太棒了。我正在使用第三个选项,它就像一个魅力!我只是想知道是否最好只使用一次 Group_concat(不限制为 5),然后稍后在 tagList 数组中使用 php 进行限制。你认为这对服务器更友好吗? 我怀疑它会产生可衡量的差异。 再次感谢您的帮助@vatev

以上是关于使用 LIKE 运算符而不限制结果的主要内容,如果未能解决你的问题,请参考以下文章

Dapper Extension LIKE 运算符在匹配字符串时以相反的顺序返回结果

不使用通配符时'='运算符和LIKE有啥区别

mysql怎么用like检索字段中带有数字的语句?

如何将 IN 运算符与 LIKE 条件相结合(或获得可比较结果的最佳方法)

特殊更新 mysql like .= php 运算符

MySQL中的Like和正则表达