加入错误和订单

时间:2016-11-06 21:37:24

标签: mysql

我正在尝试编写一个执行以下操作的查询:

对于在其地址中显示“爱丁堡”一词的每位客人,显示预订的总晚数。对于那些从未预订过的客人,请务必加0。显示姓氏,名字,地址和夜数。按姓氏排序,然后是名字。

我在使联接正常工作时遇到问题, ER Diagram代码段

ER Diagram snippet

这是我当前(破碎)的解决方案:

SELECT last_name, first_name, address, nights
FROM booking
RIGHT JOIN guest ON (booking.booking_id = guest.id)
WHERE address LIKE '%Edinburgh%';

以下是该查询的结果:

enter image description here

查询部分完成,希望有人可以帮助我并创建一个工作版本。我目前正在学习SQL,如果它是一个相当基本或愚蠢的问题,那么道歉!

3 个答案:

答案 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)

这篇文章回答了有关如何进行查询的问题。

MySQL SUM with same ID

您可以简单地使用此处引用的COALESCE来避免NULL值

How do I get SUM function in MySQL to return '0' if no values are found?