使用like或regexp标记的sql select

使用like或regexp标记的sql select,sql,regex,filter,tags,Sql,Regex,Filter,Tags,我遇到了一个问题,我真的不知道如何解决它。因此,我有一个多对多关系模型,包含以下表格:“posts”、“tags”、“posts\u to\u 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

我遇到了一个问题,我真的不知道如何解决它。因此,我有一个多对多关系模型,包含以下表格:“posts”、“tags”、“posts\u to\u 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”开头的标签。 有人知道如何解决这个问题吗? 我希望我把问题讲清楚了,以便理解


提前谢谢。

您希望所有帖子都有一个以“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;

另外,当您使用
分组方式时,您不需要
选择distinct

您的意思是标签应该至少包含一个以每个字符开头的匹配项,对吗?所以
smee、TOUTH、lala将符合您的示例。是的,正是这样!当然“s”和“t”是需要测试的。谢谢你,戈登!它几乎起作用了。当然,“s”和“t”只是一个例子。我试过用“s”和“s”,但都不起作用。有什么想法吗?谢谢你关于groub by/distinct.@IoannisPanteleakis<代码>'s'
's'
不起作用,因为它们是相同的。您应该提供一个您正在使用的真实示例。@GorgonLinoff您是对的,在仔细考虑之后,我才意识到它甚至没有多大意义(双's')。这是一个简单的个人项目,实际学习cakephp并试图弄清楚事情是如何运作的。看来你的解决方案是可行的。请您解释一下distinct left()在这里是如何工作的好吗?如果REGEXP包含更多字符的术语,我是否需要更改左侧(t.name,…)部分?再次感谢您,非常感谢。@IoannisPanteleakis。
distinct left
只是计算与查询匹配的不同字母的数量。因为每件事都以“s”或“t”开头,所以只有两种选择。所以,它确保两人都在场。非常感谢。现在清楚多了。我唯一没有完成的是left()的第二个参数。如果我使用REGEXP'sm'而不是's',我是否需要将其更改为left(t.name,2)?顺便说一句,我是stackoverflow的新手,所以看起来我仍然无法投票支持你的答案,但我会尽快投票。非常感谢。