【问题标题】:NOT IN FUNCTION in MySQL在 MySQL 中不起作用
【发布时间】:2012-05-19 15:57:35
【问题描述】:

我遇到了一个 sql 查询问题

这是我的查询:

SELECT `rooms`.*  
FROM `rooms`  
WHERE (`rooms`.`room_id` NOT IN (
    SELECT * 
    FROM `reservations` `res` 
    WHERE ('2012-05-03' NOT BETWEEN res.expected_checkin_date 
    AND res.expected_checkout_date) 
    AND ('2012-05-08' NOT BETWEEN res.expected_checkin_date 
    AND res.expected_checkout_date)))

问题是当第二个select返回null时,显示如下错误:

#1241 - Operand should contain 1 column(s)

谁能帮帮我?

EDIT

当我运行此查询时,它会显示所有行,甚至包括第二个 select 内的行 不知道为什么?

SELECT `rooms`.*, `type`.*, `status`.* FROM `rooms` INNER JOIN `room_types` AS `type` ON `type`.`room_type_id` = `rooms`.`room_type_id` AND `type`.`num_beds` >= 1 AND type.room_type_id=2 INNER JOIN `room_statuses` AS `status` ON `status`.`room_status_id` = `rooms`.`room_status_id` WHERE (`rooms`.`room_id` NOT IN (SELECT `res`.`room_id` FROM `reservations` `res` WHERE (res.expected_checkin_date >= '2012-05-01' AND res.expected_checkin_date < '2012-05-31') AND (res.expected_checkout_date >= '2012-05-31' AND res.expected_checkout_date < '2012-05-31')))

【问题讨论】:

标签: mysql sql mysql-error-1241


【解决方案1】:

我想你想要类似的东西

SELECT `reservations`.`room_id` FROM `reservations`

对于子选择,因为 room_id 是您与 NOT IN 运算符匹配的内容。

【讨论】:

    【解决方案2】:
    SELECT `rooms`.*  
    FROM `rooms`  
    WHERE (`rooms`.`room_id` NOT IN (
        SELECT * 
        FROM `reservations` `res` 
        WHERE ('2012-05-03' NOT BETWEEN res.expected_checkin_date 
        AND res.expected_checkout_date) 
        AND ('2012-05-08' NOT BETWEEN res.expected_checkin_date 
        AND res.expected_checkout_date)))
    

    NOT in 必须限制在 where 的相同值列表中,所以 * 将不起作用,除非预订只有一个 room_Id

    SELECT `rooms`.*  
    FROM `rooms`  
    WHERE (`rooms`.`room_id` NOT IN (
        SELECT res.Room_ID 
        FROM `reservations` `res` 
        WHERE ('2012-05-03' NOT BETWEEN res.expected_checkin_date 
        AND res.expected_checkout_date) 
        AND ('2012-05-08' NOT BETWEEN res.expected_checkin_date 
        AND res.expected_checkout_date)))
    

    【讨论】:

    • 谢谢你的帮助,就是因为这个。
    猜你喜欢
    • 1970-01-01
    • 2023-01-17
    • 1970-01-01
    • 2012-04-08
    • 2013-09-10
    • 2013-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    相关资源
    最近更新 更多