【问题标题】:sql select with tags using like or regexp使用 like 或 regexp 使用标签进行 sql 选择
【发布时间】:2014-01-21 20:24:22
【问题描述】:

我遇到了一个我真的不知道如何解决的问题。所以我有一个带有下表的多对多关系模型:'posts'、'tags'、'posts_to_tags'。 假设我想获取所有标签以“s”和“t”开头的帖子。我使用以下查询:

SELECT DISTINCT o.id  
FROM posts o  
JOIN posts_to_tags ot  ON o.id = ot.post_id  
JOIN tags t  ON ot.tag_id = t.id  
WHERE t.name REGEXP '^s|^t'  
GROUP BY o.id
HAVING COUNT(o.id) = 2

这在大多数情况下都可以正常工作,但并非总是如此。例如,如果有一个帖子具有以下标签:smee、smooth、lala 即使没有以“t”开头的标签(有 2 个以“s”开头的标签),查询也会成功。这里的帖子还应该有一个以“t”开头的标签。 有人对如何解决这个问题有任何提示吗? 我希望我把问题说清楚了。

提前谢谢你。

【问题讨论】:

  • 你的意思是标签应该包含至少一个匹配以每个字符开始,对吧?所以smee, tooth, lala 将匹配您的示例。
  • 是的,就是这样!当然,“s”和“t”是要测试的。

标签: sql regex filter tags


【解决方案1】:

您希望所有帖子的标签都以“s”开头,另一个标签以“t”开头。您需要更改having 子句:

SELECT o.id  
FROM posts o  
JOIN posts_to_tags ot  ON o.id = ot.post_id  
JOIN tags t  ON ot.tag_id = t.id  
WHERE t.name REGEXP '^s|^t'  
GROUP BY o.id
HAVING count(distinct left(t.name, 1)) = 2;

另外,当您使用group by 时,您不需要select distinct

【讨论】:

  • 谢谢戈登!它几乎可以工作。当然,“s”和“t”只是一个例子。我尝试使用 's' 和 's' 但它不起作用。有任何想法吗?并感谢您的 groub by / distinct。
  • @IoannisPanteleakis 。 . . 's''s' 不起作用,因为它们是相同的。您应该提供一个您正在使用的真实示例。
  • @GorgonLinoff 你说得对,在考虑了更多之后,我才意识到它甚至没有多大意义(双's')。这是一个简单的个人项目,可以实际学习 cakephp 并试图弄清楚事情是如何工作的。所以看起来你的解决方案有效。您能否解释一下不同的 left() 在这里是如何工作的?如果 REGEXP 将包含更多字符的术语,我是否需要更改 left(t.name, ...) 部分?再次感谢您,非常感谢。
  • @IoannisPanteleakis 。 . . distinct left 只是计算与查询匹配的不同字母的数量。因为一切都以“s”或“t”开头,所以只有两种选择。因此,它确保两者都存在。
  • 非常感谢。现在清楚多了。我唯一没有完成的是left()的第二个参数。如果我 REGEXP 'sm' 而不是 's',我是否需要将其更改为 left(t.name, 2)?顺便说一句,我是stackoverflow的新手,所以看起来我仍然无法投票赞成你的答案,但我会尽快。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-30
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多