我正在尝试编写一个执行以下操作的查询:
对于在其地址中显示“爱丁堡”一词的每位客人,显示预订的总晚数。对于那些从未预订过的客人,请务必加0。显示姓氏,名字,地址和夜数。按姓氏排序,然后是名字。
我在使联接正常工作时遇到问题, ER Diagram代码段
这是我当前(破碎)的解决方案:
SELECT last_name, first_name, address, nights
FROM booking
RIGHT JOIN guest ON (booking.booking_id = guest.id)
WHERE address LIKE '%Edinburgh%';
以下是该查询的结果:
查询部分完成,希望有人可以帮助我并创建一个工作版本。我目前正在学习SQL,如果它是一个相当基本或愚蠢的问题,那么道歉!
答案 0 :(得分:1)
您的查询似乎几乎正确。您使用guets id加入了预订ID,因为重叠(匹配)ID,这给了您一些结果,但这很可能与外键不对应。您应该从预订guest_id
加入id
来自客人。
我会添加分组来为特定客人预订所有预订的夜晚(假设夜晚是整数):
SELECT g.last_name, g.first_name, g.address, SUM(b.nights) AS nights
FROM guest AS g
LEFT JOIN booking AS b ON b.guest_id = g.id
WHERE g.address LIKE '%Edinburgh%'
GROUP BY g.last_name, g.first_name, g.address;
您确定应该使用nights
字段计算所用的夜晚吗?为什么它可以null
?如果你想为null值显示零,只需用这样的合并函数包装它:
COALESCE(SUM(b.nights), 0)
注意:
RIGHT JOIN
重写为LEFT JOIN
,但这不会影响结果 - 这对我来说更干净AS g
会缩短代码答案 1 :(得分:0)
SELECT g.first_name,
g.last_name,
g.address,
COALESCE(Sum(b.nights), 0)
FROM booking b
RIGHT JOIN guest g
ON ( b.guest_id = g.id )
WHERE address LIKE 'edinburgh%'
GROUP BY g.last_name,
g.first_name,
g.address;
答案 2 :(得分:-1)
这篇文章回答了有关如何进行查询的问题。
您可以简单地使用此处引用的COALESCE来避免NULL值
How do I get SUM function in MySQL to return '0' if no values are found?