首页 > 解决方案 > MySQL 查询后的重复行

问题描述

我有 2 张桌子:

___房间

|--------|------------|
| ROO_Id | ROO_Number |
|--------|------------|
| 1      | 101        |
| 2      | 102        |
| 3      | 103        |
| 4      | 104        |
| 5      | 105        |
|--------|------------|

___预订

|--------|------------|------------|------------|-------------------|
| BOO_Id | BOO_RoomId | BOO_DateCI | BOO_DateCO | BOO_ArrivalStatus |
|--------|------------|------------|------------|-------------------|
| 1      | 1          | 2018-07-03 | 2018-07-05 | checkout          |
| 2      | 2          | 2018-07-16 | 2018-07-17 | checkin           |
| 3      | 3          | 2018-07-14 | 2018-07-16 | none              | 
| 4      | 5          | 2018-07-14 | 2018-07-18 | checkin           | 
|--------|------------|------------|------------|-------------------|

我的目标是获得以下报告:

报告日期是今天:2018-07-16

|------------|----------------|-------------------|
| ROO_Number | BOO_LiveStatus | BOO_ArrivalStatus |
|------------|----------------|-------------------|
| 101        | no             | checkout          |
| 102        | in-house       | checkin           |
| 103        | in-house       | none              |
| 104        | no             | 0                 |
| 105        | in-house       | checkin           |
|------------|----------------|-------------------|

我在这里放了一个 SQLFidde: http ://sqlfiddle.com/#!9/854079/5


实际上,我很接近,但我有一个小问题。

在我的报告中,我需要 ___Rooms 表中每个房间的一行。但实际上,我有更多行(#102 为 2)。

(1, 2, '2018-07-13', '2018-07-15', 'checkout')不应显示,因为今天的日期不在 2018-07-13 和 2018-07-15 之间。


我最后一次尝试是这个:

SELECT 
    ROO_Number, 
    IF(BOO_DateCI <= '2018-07-16' AND BOO_DateCO >= '2018-07-16', 'in-house', 'no')
        AS BOO_LiveStatus,
    IFNULL(BOO_ArrivalStatus, '0') 
        AS BOO_ArrivalStatus
FROM ___Rooms
LEFT JOIN ___Bookings
    ON ___Rooms.ROO_id = ___Bookings.BOO_RoomId
ORDER BY ROO_Number

你能帮帮我吗?

非常感谢。

标签: mysql

解决方案


将日期检查添加到ON子句。

SELECT 
    ROO_Number, 
    IF(BOO_DateCI <= '2018-07-16' AND BOO_DateCO >= '2018-07-16', 'in-house', 'no')
        AS BOO_LiveStatus,
    IFNULL(BOO_ArrivalStatus, '0') 
        AS BOO_ArrivalStatus
FROM ___Rooms
LEFT JOIN ___Bookings
    ON ___Rooms.ROO_id = ___Bookings.BOO_RoomId 
        AND CURDATE() BETWEEN ___Bookings.BOO_DateCI AND ___Bookings.BOO_DateCO
ORDER BY 
  ROO_Number

您需要这样做,ON而不是WHERE因为将其放入WHERE将过滤掉所有没有预订的房间(因为列将是NULL)。

SqlFiddle


推荐阅读