【问题标题】:Appending new fields from another JOIN statements in MySQL query在 MySQL 查询中附加来自另一个 JOIN 语句的新字段
【发布时间】:2015-04-18 04:46:37
【问题描述】:

所以,我有 3 张桌子:

guest : 
id_guest | name
1        | John
2        | Nick
3        | James
4        | Paul
5        | Chris
6        | Karen
7        | Peter

room :  
id_room  | status
1        | Clean
2        | Dirty
3        | Dirty
4        | Clean
5        | Clean
6        | Clean

reservation : 
id_guest | id_room  | date
1        | 1        | 2015-04-15
1        | 1        | 2015-04-16
1        | 1        | 2015-04-17
2        | 3        | 2015-04-15
3        | 4        | 2015-04-15
3        | 4        | 2015-04-16
4        | 2        | 2015-04-16
5        | 2        | 2015-04-17
6        | 2        | 2015-04-18

这就是预期的输出:

id_room  | status   | d04-15    | d04-16    | d04-17    | d04-18
1        | Clean    | John      | John      | John      |
2        | Dirty    |           | Paul      | Chris     | Karen
3        | Dirty    | Nick      |           |           |
4        | Clean    | James     | James     |           |
5        | Clean    |           |           |           |
6        | Clean    |           |           |           |

我已经能够在第三个字段 (d04-15) 之前显示它,尽管使用日期作为值,使用:

SELECT room.id_room,
       room.status,
       reservation.date AS d04-15
FROM room
LEFT JOIN reservation
ON room.id_room = reservation.id_room AND reservation.date = '2015-04-15'
GROUP BY room.id_room

但我不确定如何在此处显示名称和 从另一个 JOIN 语句追加新字段(d04-16、d04-17 和 d04-18)。

任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: mysql join field


    【解决方案1】:

    查询中返回的列不能在运行时更改;它们必须在 SQL SELECT 语句中静态声明。

    下面是一个可以达到指定结果的语句示例:

    SELECT m.id_room
         , m.status
         , MAX(IF(r.date='2015-04-15',g.name,NULL)) AS `d04-15`
         , MAX(IF(r.date='2015-04-16',g.name,NULL)) AS `d04-16`
         , MAX(IF(r.date='2015-04-17',g.name,NULL)) AS `d04-17`
         , MAX(IF(r.date='2015-04-18',g.name,NULL)) AS `d04-18`
      FROM room m
      LEFT
      JOIN reservation r
        ON r.id_room = m.id_room
       AND r.date IN ('2015-04-15','2015-04-16','2015-04-17','2015-04-18')
      LEFT
      JOIN guest g
        ON g.id_guest = r.id_guest
     GROUP BY m.id_room
    

    【讨论】:

    • 非常感谢,我已经测试过了,它看起来就像我一直在寻找的东西。不过只是一个小错字,我认为 r.reservation.date 应该是 r.date,并且在 2015-04-16 之后缺少撇号。
    • @jhnwck:很好,我已经更正了。此查询假定保留元组 (id_guest,id_room,date) 是唯一的。如果该元组不是,则 GROUP BY 将折叠行,并返回“最大”来宾名称。其他客人姓名将被丢弃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 2012-12-20
    • 1970-01-01
    • 2012-03-15
    • 2014-06-25
    相关资源
    最近更新 更多