这确实很复杂,然后我将举一个示例以使其变得更容易。
想象一下,我们有4张桌子:车库,汽车,证券,地方。
garages
是您可以找到的地方cars
,securities
是可以确保那辆车在车库内安全的安全设施,也是places
可以找到与该车库相似的车库的地方。然后我们有一张这样的桌子。
台式车库:
-----------------------------------
|garage_id|garage_name|garage_size|
-----------------------------------
| 1| Garage 1| 200|
-----------------------------------
| 2| Garage 2| 400|
-----------------------------------
车表:
---------------------------
|car_id|car_name|garage_id|
---------------------------
| 1| Car 1| 1|
---------------------------
| 2| Car 2| 1|
---------------------------
| 3| Car 3| 2|
---------------------------
证券表:
----------------------------------
|security_id|security_name|car_id|
----------------------------------
| 1| Security 1| 1|
----------------------------------
| 2| Security 2| 1|
----------------------------------
| 3| Security 3| 2|
----------------------------------
| 4| Security 4| 3|
----------------------------------
位置表:
-------------------------------
|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 1
有Car 1
和Car 2
和Car 1
有两个证券Security 1
和Security 2
和Car 2
有1个是Security 3
。
这里的问题是:如何连接表并在一个查询中计数并返回结果,就像您在上面看到的那样?
只需加入所有表,按车库分组并计算不同的匹配项:
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;
至于所需的输出字符串,请连接您的结果:
g.garage_name || ' has ' || count(distinct c.car_id) || ' cars with ' || ...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句