visit
tid pid date
112 45 12-03-12
124 12 13-04-03
112 32 12-03-12
421 14 14-01-31
place
pid start end starttime endtime
45 xyz qwe 12:00:13 14:30:00
12 abc yst 15:45:00 16:00:00
32 tyu jkf 15:30:00 17:30:00
14 nyk por 08:30:00 10:00:50
我很难过这件事。我知道一点点和零件,但我无法将它们全部融合在一起。我需要如下结果
tid start end
112 xyz jfk
124 abc yst
421 nyk por
如图所示,我需要在同一天只派出一个票证实例。但我需要根据时间开始和结束的地方。 start应该具有最早的实例,同时根据startime和endtime结束最新的实例。
答案 0 :(得分:1)
这应该可以为您提供所需的信息。
create table visit ( tid varchar(16), pid varchar(16), date datetime );
insert into visit values
(112, 45, '2012-03-12'),
(124, 12, '2013-04-03'),
(112, 32, '2013-03-12'),
(421, 14, '2014-01-31');
create table place ( pid varchar(16), start varchar(16), end varchar(16), starttime datetime, endtime datetime );
insert into place values
(45, 'xyz', 'qwe', '2012-03-12 12:00:13', '2012-03-12 14:30:00'),
(12, 'abc', 'yst', '2013-04-03 15:45:00', '2013-04-13 16:00:00'),
(32, 'tyu', 'jkf', '2012-03-12 15:30:00', '2012-03-12 17:30:00'),
(14, 'nyk', 'por', '2014-01-31 08:30:00', '2014-01-31 10:00:50');
select v.tid,
(select start from place where starttime = min(p.starttime)) as start,
(select end from place where endtime = max(p.endtime)) as end
from visit v
join place p using (pid)
group by v.tid;
+------+-------+------+
| tid | start | end |
+------+-------+------+
| 112 | xyz | jkf |
| 124 | abc | yst |
| 421 | nyk | por |
+------+-------+------+
注意#1:我的repro使用MySQL,所以如果标准SQL与我所看到的不同,请随意评论/投票给另一个答案。
注意#2:您应该在place
表格中使用日期时间(而不仅仅是时间),以允许通宵航班。
答案 1 :(得分:0)
我认为像这样的SQL查询会返回您想要的结果。
SELECT DISTINCT visit.tid,
(
SELECT TOP 1 start
FROM place
WHERE pid = visit.pid
ORDER BY starttime ASC
) as start,
(
SELECT TOP 1 end
FROM place
WHERE pid = visit.pid
ORDER BY endtime DESC
) as end
FROM visit