首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >把三张桌子连在一起数一数

把三张桌子连在一起数一数
EN

Stack Overflow用户
提问于 2014-12-12 14:11:25
回答 3查看 75关注 0票数 0

这是非常复杂的,然后我会说一个例子,以使它更容易。

想象一下我们有4张桌子:车库,汽车,证券,地方。

garages是你可以找到cars的地方,securities是在车库里保持汽车安全的保安,而places是你可以找到类似于那个车库的车库。那我们就有一张这样的桌子。

车库桌:

代码语言:javascript
运行
复制
-----------------------------------
|garage_id|garage_name|garage_size|
-----------------------------------
|        1|   Garage 1|        200|
-----------------------------------
|        2|   Garage 2|        400|
-----------------------------------

汽车桌:

代码语言:javascript
运行
复制
---------------------------
|car_id|car_name|garage_id|
---------------------------
|     1|   Car 1|        1|
---------------------------
|     2|   Car 2|        1|
---------------------------
|     3|   Car 3|        2|
---------------------------

证券表:

代码语言:javascript
运行
复制
----------------------------------
|security_id|security_name|car_id|
----------------------------------
|          1|  Security 1|      1|
----------------------------------
|          2|  Security 2|      1|
----------------------------------
|          3|  Security 3|      2|
----------------------------------
|          4|  Security 4|      3|
----------------------------------

地点表:

代码语言:javascript
运行
复制
-------------------------------
|place_id|place_name|garage_id|
-------------------------------
|       1|   place 1|        1|
-------------------------------
|       2|   place 2|        1|
-------------------------------
|       3|   place 3|        1|
-------------------------------
|       4|   place 4|        2|
-------------------------------
|       5|   place 5|        2|
-------------------------------

我想要的是列出车库,加入三张桌子,即汽车、证券和像这样的地方:

车库1有2辆车,3辆有价证券,还有3辆类似的车库。 车库2有1辆有1辆有价证券的汽车,还有2辆类似的车库。

现在你可能会问,为什么Garage 1有3种证券?因为Garage 1Car 1Car 2Car 1有两种证券,Security 1Security 2Car 2有1,也就是Security 3

这里的问题是:如何连接表并在一个查询中计数并返回结果,就像上面所看到的那样?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-12-12 14:23:07

只需加入所有表,按车库分组并计数不同的匹配:

代码语言:javascript
运行
复制
select 
  g.garage_name, 
  count(distinct c.car_id) as count_cars,
  count(distinct s.security_id) as count_securities,
  count(distinct p.place_id) as count_places
from garages g
left join cars c on c.garage_id = g.garage_id
left join securities s on s.car_id = c.car_id
left join places p on p.garage_id = g.garage_id
group by g.garage_name
order by g.garage_name;

对于所需的输出字符串,连接您的结果:

代码语言:javascript
运行
复制
g.garage_name || ' has ' || count(distinct c.car_id) || ' cars with ' || ...
票数 2
EN

Stack Overflow用户

发布于 2014-12-12 14:18:49

代码语言:javascript
运行
复制
SELECT
 gb.garage_name,
 (
  SELECT COUNT(*) FROM cars_table ct WHERE ct.garage_id = db.garage_id
 ) as car_count,
 (
  SELECT COUNT(*) FROM security_table st JOIN cars_table ct ON ct.car_id = st.car_id WHERE ct.garage_id = db.garage_id
 ) as security_count,
FROM
garages_table gb
ORDER BY gb.garage_id

这是未经检验的,但这是一个想法。

票数 1
EN

Stack Overflow用户

发布于 2014-12-12 14:19:44

这个查询应该完成以下工作:

代码语言:javascript
运行
复制
SELECT g.garage_id, g.garage_name, COUNT(c.car_id) AS nb_cars,
    COUNT(s.security_id) AS nb_securities, COUNT(p.place_id) AS nb_places
FROM garages g
    LEFT JOIN cars c ON g.garage_id = c.garage_id
    LEFT JOIN securities c.car_id = s.car_id
    LEFT JOIN places.p ON g.garage_id = p.garage_id
GROUP BY g.garage_id

你会得到所有车库的名单,包括那些没有汽车或周围的地方。如果你想把没有车的车库过滤掉,那就使用INNER JOIN cars ...。若要筛选出没有位置的车库,请使用INNER JOIN places ...

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27445457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档