这是非常复杂的,然后我会说一个例子,以使它更容易。
想象一下我们有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
。
这里的问题是:如何连接表并在一个查询中计数并返回结果,就像上面所看到的那样?
发布于 2014-12-12 14:23:07
只需加入所有表,按车库分组并计数不同的匹配:
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 ' || ...
发布于 2014-12-12 14:18:49
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
这是未经检验的,但这是一个想法。
发布于 2014-12-12 14:19:44
这个查询应该完成以下工作:
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 ...
。
https://stackoverflow.com/questions/27445457
复制相似问题