2014-08-30 131 views
0

间隔我有台这样的事情(也有“DEVICE_ID”和“时间戳”列)查询选择在

day | interval | value 
---------------------------- 
1 | 14  | 63 // start of a day 
1 | 14  | 83 
1 | 14  | 73 

1 | 15  | 23 
1 | 15  | 33 
1 | 15  | 50 

2 | 16  | 23 // start of a day 
2 | 16  | 33 
2 | 16  | 50 

我想选择在一天的所有时间间隔。这很简单。

然而,时间间隔可以在一天前翻转启动了一下,还是结束了一下过去:

day | interval | value 
---------------------------- 
7 | 14  | 63 
7 | 14  | 83 
8 | 14  | 73 // start of a day 

8 | 15  | 23 
8 | 15  | 33 
8 | 15  | 50 

8 | 16  | 23 
8 | 16  | 33 
9 | 16  | 50 // start of a day 

现在,我想选择所有三个区间 - 甚至更好的间隔是大多在天。

SELECT ... WHERE day = 8 

仅给出部分开始/结束间隔(14,16)。这没用,我需要完整的时间间隔。

如果没有解决方案,我只做三个查询,但可能有一些我不知道的SQL技巧?

它是从PHP调用的MySQL。

更直观:

day 7   | day 8    | day 9 
------------------+-------------------+--------------- 
    ###13### ###14### ###15### ###16### ###17### 
     ... 63 83 73 23 33 50 23 33 50 ... 

我想所有的值在第8天 - >间隔14,15,16

+0

请说明目标结果 - 目前尚不清楚。 – 2014-08-30 23:21:15

+0

我想要有完整的时间间隔,部分在一天。 – MightyPork 2014-08-30 23:21:52

+0

这是一个简单的连接。 – Strawberry 2014-08-31 00:09:18

回答

1

认为您正在寻找这样的:

SELECT * FROM intervals 
WHERE interval IN (
    SELECT DISTINCT interval FROM intervals WHERE day = 8) 

这将选择所有间隔数据,其中该间隔的至少一个条目在第8天发生。子查询确定哪一个唯一间隔在一天中发生,哪个然后由外部查询使用来选择它们的细节。

+0

不知道我是否做错了,但我试过这个和PHP页面完全冻结。注意,表中有数百万行... – MightyPork 2014-08-30 23:37:19

+0

这是正确的答案,但是如果你没有单独的'天'和'间隔'索引并且有数百万行,你可能会遇到性能问题。如果需要帮助分析性能,请发布此查询的查询计划。 – 2014-08-31 02:11:17

0
SELECT DISTINCT y.* 
    FROM my_table x 
    JOIN my_table y 
    ON y.some_column = x.some_column 
WHERE x.some_other_column = 8; 
+0

在我尝试之前 - 它能比Niels的解决方案更快吗? – MightyPork 2014-08-31 00:16:49

+0

Duh,很显然,如果一天是7日,然后是8日,那么不难发现改变的日子。 – MightyPork 2014-08-31 00:17:56

+0

嗯..我有天和间隔INDEX,另一个单独一天.. – MightyPork 2014-08-31 00:19:00