【问题标题】:Return query with complex where condition返回具有复杂 where 条件的查询
【发布时间】:2017-01-25 05:58:02
【问题描述】:

我有一张这样的桌子

allotment

allotment_id | date | room_id | is_closed
-----------------------------------------
1 | 2017-01-28 | 21 | 0
2 | 2017-01-29 | 21 | 1
3 | 2017-01-30 | 21 | 0
4 | 2017-01-31 | 21 | 0
5 | 2017-01-28 | 32 | 0
6 | 2017-01-29 | 32 | 0
7 | 2017-01-30 | 32 | 0
8 | 2017-01-31 | 32 | 0

我正在尝试这样的查询:

SELECT *
FROM allotment
WHERE date BETWEEN '2017-01-28' AND DATE_SUB('2017-01-31', INTERVAL 1 DAY)
AND is_closed = 0
AND date >= '2017-01-28' AND l.`date` <= DATE_SUB('2017-01-31', INTERVAL 1 DAY) AND allotment_id NOT IN (select allotment_id FROM allotment WHERE is_closed = 1 AND date >= '2017-01-28' AND date <= '2017-01-31')

如您所见,我选择日期为 2017-01-28 到 2017-01-31,桌子上有两个房间 ID,room_id 21 日期为 2017-01-29 is_closed 为 1。

我想要的只是返回 room_id 32,因为在 room_id 21 中,我选择的日期范围是 is_closed 中的值 1。 p>

我已经尝试过我的查询,但它不起作用。我怎么能这样做。

谢谢。

【问题讨论】:

  • 您在哪里和子查询中使用了 allotment_id。而不是这个,你必须使用 room id
  • 在这里向我们展示您的预期输出可能会有所帮助。
  • 你试过我的答案了吗?
  • @krishnpatel 先生,它有效。谢谢。
  • @Antonio 你能回答一下吗?

标签: php mysql codeigniter codeigniter-3


【解决方案1】:

在哪里和子查询中,您使用了 allotment_id。而不是这个,你必须带房间号

SELECT *
FROM allotment
WHERE date BETWEEN '2017-01-28' AND DATE_SUB('2017-01-31', INTERVAL 1 DAY)
AND is_closed = 0 and room_id not in (select room_id FROM allotment WHERE is_closed = 1 AND date >= '2017-01-28' AND date <= '2017-01-31')

【讨论】:

【解决方案2】:

按房间分组,只选择那些is_closed 标志为零次的人

SELECT room_id
FROM allotment
WHERE date >= '2017-01-28' 
  AND date <= '2017-01-31'
group by room_id
having sum(is_closed = 1) = 0

【讨论】:

  • 比这更具体
  • 它仍然返回 room_id 21 因为在 2017-01-28 中有值 0 在 is_closed
  • 如果您使用我的查询,我很确定这不可能。你确定吗?
  • @Antonio 它确实有效。See demo here.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-14
  • 2015-03-06
  • 1970-01-01
  • 2021-07-29
相关资源
最近更新 更多