2014-08-30 110 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