使用 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 运算符在匹配字符串时以相反的顺序返回结果