具有多个表的联结表上的 MySQL SELECT 查询

Posted

技术标签:

【中文标题】具有多个表的联结表上的 MySQL SELECT 查询【英文标题】:MySQL SELECT query on junction table with multiple tables 【发布时间】:2013-09-25 11:50:59 【问题描述】:

我有四个表,假设每个表只有一个 id 作为列。

listings feature location l_f_locationlistingIdfeatureIdlocationId 上的 FK 的连接表

我尝试在l_f_location 表中查询一组给定的locationIds(逻辑与匹配),结果只希望那些匹配所有locationIds 的列表,例如(7 和 9 和 10)。

l_f_location 看起来像

listingId featureId locationId
10        5         7
10        7         7
10        8         9
11        4         7
11        8         9
11        9         10
11        12        14

在这种情况下,目标是仅检索 listingId 11 - 匹配 locationIds 7、9 和 10 的集合。

我尝试了以下查询

SELECT id, COUNT(*) as num FROM l_f_locations WHERE locationId IN ( 7, 9, 10) GROUP by listingId, locationId HAVING num = 3

但这会在分组开始时给出错误的计数值。

类似的查询可以在更简单的联结表上完美运行,例如只有 l_location 与例如“SELECT id, COUNT(*) as num FROM l_location WHERE locationId IN ( 7, 9, 10) GROUP by listingId HAVING num = 3”。

Rgds, P.

【问题讨论】:

在第一个查询中为什么要在GROUP BY 子句中包含locationId 我按listingId 和locationId 分组,以将结果减少到我希望按listingId 计算的数量。 不,我正在寻找一个包含 7、8、9 的 listingId。它可能有其他的,但在这个查询中没问题。 在 l_f_location 表中添加了另一行 - 所以 ListingId 11 仍然匹配,有 7,9,10。 这就是我所困惑的,您已经有一个有效的查询,但您想在我不明白的 group by 子句中添加locationID。对不起 【参考方案1】:

我假设同一个listingIdlocationId 可以有多个featureIds?否则会容易一些。

如果是这样的话:

SELECT listingId, COUNT(*) as num 
FROM
(SELECT DISTINCT listingId, locationId
 FROM l_f_locations
 WHERE locationId IN ( 7, 9, 10)) AS sub
GROUP by listingId, HAVING num = 3 

【讨论】:

是的,你猜对了。内部选择需要别名,所以它像SELECT listingId, COUNT(*) as num FROM (SELECT DISTINCT listingId, locationId FROM l_f_locations WHERE locationId IN ( 7, 9, 10)) AS foo GROUP by listingId, HAVING num = 3 太棒了。让我知道它是否有效。如果没有,创建一个演示问题的 SQL Fiddle 可能是最简单的。 我正在测试,目前看起来还不错。将进行更多测试,然后接受您的答案。非常感谢! 如果没有AS 子句,它会失败吗?我认为它应该仍然有效。 感谢您告诉我。我已经更新了那个答案。

以上是关于具有多个表的联结表上的 MySQL SELECT 查询的主要内容,如果未能解决你的问题,请参考以下文章

Mysql在同一张表上的多个左连接

如何管理联结表上的插入

mysql笔记(12)

第十五章联结表

MySQL数据库 (下)

MySQL join 与关系表上的匹配