Php 返回带有复杂where条件的查询

Php 返回带有复杂where条件的查询,php,mysql,codeigniter,codeigniter-3,Php,Mysql,Codeigniter,Codeigniter 3,我有一张这样的桌子 表分配 我是这样想的: 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 *
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年1月28日到2017年1月31日,桌上有两个房间标识,2017年1月29日的21号房间标识为1

我想要的是只返回room_id 32,因为在我选择的日期范围为1的room_id 21中,已关闭

我尝试了我的查询,但它不起作用。我怎么能这么做呢


谢谢。

按房间分组,只取零次关闭标志的房间


在where和subquery中,您使用了分配号。您必须使用房间号,而不是分配号

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')

更具体地说,它仍然返回房间id 21,因为在2017年1月28日,is_close中有值0。如果您使用我的查询,我很确定这不可能。你确定吗?@Antonio它确实有效..在where和子查询中,你使用了分配id。你必须使用房间id来代替它。在这里显示你的预期输出可能会有所帮助。你尝试过我的答案吗?@krishnpatel它有效,先生。谢谢你。@Antonio你能帮我回答问题吗?你能帮我回答这个问题吗[
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
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')