MySQL 从多个值中选择,只返回完全匹配

Posted

技术标签:

【中文标题】MySQL 从多个值中选择,只返回完全匹配【英文标题】:MySQL SELECT from multiple values, return only exact matches 【发布时间】:2014-04-04 18:34:39 【问题描述】:

我有一个查询,它获取从先前查询中获得的标签 ID,并从 post_tag_map 表中选择帖子 ID。

例如,$tagIds 可以是 "3,4,23,54"

'SELECT post_id FROM post_tag_map WHERE tag_id IN (' . $tagIds . ') ORDER BY `post_id`;'

这个查询可以正常工作,但它会返回任何具有这些 tag_id 之一的 post_id。

我正在尝试仅获取包含所有这些 tag_id 的 post_id。

例如,如果我搜索“新闻、政治、竞选”,我只想返回带有所有这三个标签的帖子,而不是任何带有这三个标签之一的帖子。

如何更改我的查询?

编辑:根据要求,我的表结构是 3 个表。一个(post)有post_id和post信息,一个(tag)有tag_id和tag_name,还有post_tag_map,只是把两个Id映射在一起。

【问题讨论】:

展示您的表格的外观示例 您的查询是用 4 个数字固定还是可以变化? 因人而异。 0-5。我将使用表格结构编辑我的帖子。 所以最多 5 个 ID?还是更多? 【参考方案1】:

这会有点复杂

保留您的 IN 内容,但也可以将帖子分组以找到完全匹配的帖子

WHERE tag_id IN (3,4,23,54) GROUP BY `post_id` HAVING count(1) = 4;

其中 4 是我们正在寻找的标签数量

【讨论】:

所以我可以只计算数组中的项目数并将其用作 count(1) = $count? 是的。我正在写常数,因为我不愿意在查询中直接写变量。而且您也不应该在查询中使用任何变量 +1 : 开箱即用的想法...我会写 5 条 AND 语句:D 这很好用。我确实根据$tagCount = count($tagIds); 在最后放了一个变量。这里是否存在严重的安全问题? @Kevin 严格来说,这是二阶 SQL 注入的确切情况。我知道这些值来自 int 字段...但同样,我更喜欢永远不会违反的规则。

以上是关于MySQL 从多个值中选择,只返回完全匹配的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 从具有相同结构但数据不同的多个表中选择数据

MySQL 从特定值中选择

从下拉列表 Select2 中的多个值中获取选定值

SQL 从多个表中选择 *

Python 函数可以只返回两个值中的第二个吗?

来自多个表的 MySQL 最新相关记录