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 从多个值中选择,只返回完全匹配的主要内容,如果未能解决你的问题,请参考以下文章