希望有人可以说..
Table A Table E
Id | Date Id | Start_date | End_date
1 2012-12-10 1 2012-12-09 2012-12-10
2 2012-12-11 2 2012-12-12 2012-12-14
我希望的结果。
2012年12月11日
这是我认为可能用于从表A中选择不在表E范围内的日期的代码......
SELECT * FROM `A`
WHERE `A`.`DATE` NOT BETWEEN (SELECT `E`.`DATE_START` FROM `E`) AND (SELECT `E`.`DATE_END`
FROM `E`);
但遗憾的是,子查询返回超过1行。
我不知道怎么样?
感谢
答案 0 :(得分:1)
您想知道子查询如何返回多行?那是因为表格中有多行符合您的查询。
如果您想要一行,则需要更多地限制查询,例如:
select `e`.`date_start` from `e` where `e`.`id` = 1
如果您希望A中的所有日期都未包含在E中的任何日期范围内,则一种方法是获取 的A日期列表>包含在一个范围内,然后从A获取一个不在那个列表中的日期列表。
类似的东西:
select date
from a
where date not in (
select a.date
from a, e
where a.date between e.start_date and e.end_date
)
将其通过优秀的phpMyAdmin demo网站:
create table a (id int, d date);
create table e (id int, sd date, ed date);
insert into a (id, d) values (1, '2012-12-10');
insert into a (id, d) values (2, '2012-12-11');
insert into e (id, sd, ed) values (3, '2012-12-09', '2012-12-10');
insert into e (id, sd, ed) values (4, '2012-12-12', '2012-12-14');
select d from a where d not in (
select a.d from a, e where a.d between e.sd and e.ed
);
导致输出:
2012-12-11
根据需要。
答案 1 :(得分:0)
如果表A中的Id与表E中的Id相同:
SELECT *
FROM A, E
WHERE A.Id = E.Id
AND A.Date NOT BETWEEN E.Start_Date AND E.End_Date
答案 2 :(得分:0)
要从A中获取不在E中任何日期范围内的所有记录,请获取日期范围内的记录,并选择不在该结果中的记录:
select *
from A
where Id not in (
select A.Id
from A
inner join E on A.Date between E.Start_date and E.End_date
)
答案 3 :(得分:0)
你在这里寻找的是A中的记录集,其中B中没有记录,其中A中的日期在B中的开始日期和结束日期之间。
因此我建议您以这种方式构建查询。
像...一样的东西。
Select ...
From table_A
Where not exists (
Select null
From table_b
Where ...)
根据表的连接基数及其大小,您可能会发现这比“查找不存在于约会的集合中的行”方法更好,除了它更直观的匹配你的逻辑。