mysql - 仅从 MySQL 查询中返回较高的 ID

标签 mysql pdo

我有 2 个表:

___房间

|--------|------------|
| ROO_Id | ROO_Number |
|--------|------------|
| 22     | 101        |
| 23     | 102        |
| 24     | 201        |
|--------|------------|

___预订

|--------|------------|------------|------------|-------------------|
| BOO_Id | BOO_RoomId | BOO_DateCI | BOO_DateCO | BOO_ArrivalStatus |
|--------|------------|------------|------------|-------------------|
| 34     | 22         | 2018-07-17 | 2018-07-20 | checkin           |
| 35     | 23         | 2018-07-17 | 2018-07-18 | checkout          |
| 36     | 24         | 2018-07-19 | 2018-07-21 | none              | 
| 37     | 23         | 2018-07-18 | 2018-07-21 | none              | 
|--------|------------|------------|------------|-------------------|

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

The date of the report is today : 2018-07-18.

|------------|----------------|-------------------|
| ROO_Number | BOO_LiveStatus | BOO_ArrivalStatus |
|------------|----------------|-------------------|
| 101        | in-house       | checkin           |
| 102        | none           | no                |
| 201        | none           | no                |
|------------|----------------|-------------------|

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


其实我已经很接近了,但是我有一点问题。

我需要每个房间只有一行。对于 102 号房间,我有两个连续的预订,我的查询为它返回了两行,而它应该返回给我 具有更高 ID (BOO_Id) 的预订


我最后一次尝试是这个:

SELECT 
    ROO_Id,
    IF(BOO_DateCI <= '2018-07-18' AND BOO_DateCO >= '2018-07-18', "in-house", "no")
        AS BOO_LiveStatus,
    IFNULL(BOO_ArrivalStatus, "0") 
        AS BOO_ArrivalStatus,
    BOO_Id,
FROM ___Rooms
LEFT JOIN ___Bookings
    ON ___Rooms.ROO_id = ___Bookings.BOO_RoomId 
        AND '2018-07-18' BETWEEN ___Bookings.BOO_DateCI AND ___Bookings.BOO_DateCO
WHERE ROO_Status != 'inactive'
ORDER BY 
  ROO_Number

你能帮帮我吗?

非常感谢。

最佳答案

你应该通过 BOO_RoomId 在 max(BOO_DateCI) 组上添加一个内部连接

  SELECT 
    ROO_Id,
    IF(BOO_DateCI <= '2018-07-18' AND BOO_DateCO >= '2018-07-18', "in-house", "no")
        AS BOO_LiveStatus,
    IFNULL(BOO_ArrivalStatus, "0") 
        AS BOO_ArrivalStatus,
    BOO_Id
FROM ___Rooms
inner join  (
  select  BOO_RoomId,max(BOO_DateCI) max_BOO_DateCI
  from ___Bookings
  group by BOO_RoomId

) t on t.BOO_RoomId = ___Rooms.ROO_id 
LEFT JOIN ___Bookings
    ON ___Rooms.ROO_id = ___Bookings.BOO_RoomId 
        AND '2018-07-18' BETWEEN ___Bookings.BOO_DateCI AND ___Bookings.BOO_DateCO
        AND t.max_BOO_DateCI=  ___Bookings.BOO_DateCI
ORDER BY 
  ROO_Number

关于mysql - 仅从 MySQL 查询中返回较高的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51406164/

相关文章:

MySQL 列默认值 - 优点/缺点,我应该用于所有列吗?

php - 使用 $_POST 从 Select 语句设置文本框值?

用于网站的 PHP 和 MYSQL 登录系统,卡在用户创建上

php - 代理商销售报告,汇总所有销售额并按总销售额最小化显示结果

php - Sphinx 排序模式在 PHP 中不起作用

java - 如果不存在则创建一个新数据库

java - 向服务器端发送请求

php - SQLite3/PDO - 虽然确实存在但没有这样的表

php - SQL - Where 子句和 distinct

php - 查询结果数组修改