MySQL使用join计算来自多个表的行

时间:2015-07-27 12:52:04

标签: mysql sql

我有3个MySQL表:

**locations**
id      location_name
1       London
2       New York
3       Washington

**bookings**
id      voucher_code    location_id
1       DISC100         1
2       NULL            NULL
3       DISC200         1
4       DISC500         2
5       DISC700         1

**vouchers**
id      voucher_code    net_value
1       DISC100         155.00
2       DISC200         135.00
2       DISC500         155.00
2       DISC700         155.00

我试图显示每个位置的凭证净值计数。例如,你可以看到伦敦'伦敦' location有3张已在bookings表中兑换的优惠券,其中2张是155.00价值凭证,一张是135.00。我需要编写一个MYSQL查询来将这些计数从数据库中提取出来。

因此,以上表为例,我的SQL查询应该产生以下结果:

Location            netValue155     netVaue135
London              2               1
New York            1               0
Washington          0               0

以下是我到目前为止所写的内容:

select 
    l.location_name,
    '' as date_from, 
    '' as date_to,
    v.netValue155
from locations l 
left join (select voucher_code, count(distinct id) as netValue155 from vouchers where net_value='155.00' group by id) as v

2 个答案:

答案 0 :(得分:2)

select a.location_name, sum(netvalue155), sum(netvalue135) from
(select l.id ,l.location_name,
case when v.net_value = 155 then 1 else 0 end as netvalue155,
case when v.net_value = 135 then 1 else 0 end as netvalue135
from locations l left join bookings b
on l.id = b.location_id
left join vouchers v
on  b.voucher_code = v.voucher_code) a
right join locations l on l.id = a.id
group by a.location_name

[sql fiddle] http://sqlfiddle.com/#!9/daefd/19

答案 1 :(得分:1)

你应该这样做:

SELECT 
    l.location_name AS Location,
    SUM(IF(v.net_value=155, 1, 0)) AS netValue155,
    SUM(IF(v.net_value=135, 1, 0)) AS netVaue135
FROM
    locations AS l
LEFT JOIN 
    bookings AS b ON (l.id = b.location_id)
LEFT JOIN 
    vouchers AS v ON (v.voucher_code = b.voucher_code)
GROUP BY 
    l.id