获取与左联接表匹配的行数?

qlzsbp2j  于 2021-06-20  发布在  Mysql
关注(0)|答案(4)|浏览(183)

我有以下表格:

Persons  
|id   |firstname|lastname|  
|-----|---------|--------|  
|1    |John     |Doe     |  
|2    |Jim      |Smith   |  
|3    |Jane     |Boggard |  
|4    |Joe      |Dash    |  

Vehicles
|p_id |type   |
|-----|-------|
|1    |car    |
|1    |bike   |
|1    |car    |
|2    |car    |
|3    |car    |
|3    |bike   |
|4    |plane  |

我想找到一种方法来获得每个人的汽车数量(即:匹配“vehicles”联接表的行数)。我在联接表中尝试了涉及count的子查询,但得到了错误的结果。
我预期的结果如下:

|firstname|lastname|nb_cars|  
|---------|--------|-------|
|John     |Doe     |2      |  
|Jim      |Smith   |1      | 
|Jane     |Boggard |1      |  
|Joe      |Dash    |0      |

我怎么能做到呢?

bxfogqkk

bxfogqkk1#

你必须使用 join & group by 条款,如:

SELECT p.firstname, p.lastname, count(v.p_id) AS nb_cars
FROM Persons p
JOIN Vehicles v ON p.id = v.p_id
GROUP BY p.id
azpvetkf

azpvetkf2#

试试这个

Select p.firstname, p.lastname, count(v.p_id) as no_of_car
From Persons p left join Vehicles v on (p.id = v.p_id and v.type = 'car')
group by p.firstname, p.lastname
xlpyo6sf

xlpyo6sf3#

做左连接和
aggregate sum 功能

select p.firstname, p.lastname, 
   sum(case when v.type='car' then 1 else 0 end) as nb_cars
    from Persons p
    left outer join Vehicles v on p.id = v.p_id

    group by p.id, p.firstname, p.lastname

firstname   lastname    nb_cars
John        Doe          2
Jim         Smith        1
Jane        Boggard      1
joe         Dash         0

http://sqlfiddle.com/#!2016年9月D72/1

carvr3hs

carvr3hs4#

试试这个:

select *,
       (select count(*) from Vehicles
        where p_id = p.id and type = 'car')
from Persons p'

相关问题