具有多个表的联结表上的 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_location
与 listingId
、featureId
、locationId
上的 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】:
我假设同一个listingId
和locationId
可以有多个featureId
s?否则会容易一些。
如果是这样的话:
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 查询的主要内容,如果未能解决你的问题,请参考以下文章