2015-12-16 25 views
1

我有如下表(完整的模式包括,但只有時間值是必要的:當值來自多個表時,你如何使用SQLite中的WHERE BETWEEN子句?

「點」 TABLE

 TSTAMP,     LAT, LON,  HDOP, ALT,  FILE,  EUID 
    "2015-12-15T20:29:54" "0.0" "0.0" "99.99" "NULL" "L151400.GPS" "080D55" 
    "2015-12-15T20:29:55" "0.0" "0.0" "99.99" "NULL" "L151400.GPS" "080D55" 
    "2015-12-15T20:29:56" "0.0" "0.0" "99.99" "NULL" "L151400.GPS" "080D55" 

「AUDIO」 TABLE

START,     STOP,     NCHANNELS,  SAMPWIDTH, FRAMERATE, NFRAMES, COMPTYPE, COMPNAME, FILE, FILESIZE, EUID 
"2015-12-15T22:37:00" "2015-12-15T22:39:53" "1.0" "2.0" "16000.0" "2777088.0" "NONE" "not compressed" "static/uploads/WAV/L151637.WAV" "5554688.0" 
"2015-12-15T22:27:00" "2015-12-15T22:37:00" "1.0" "2.0" "16000.0" "9601024.0" "NONE" "not compressed" "static/uploads/WAV/L151627.WAV" "19202560.0" 
"2015-12-15T22:17:00" "2015-12-15T22:27:00" "1.0" "2.0" "16000.0" "9601024.0" "NONE" "not compressed" "static/uploads/WAV/L151617.WAV" "19202560.0" 

我需要找到POINTS表中的每條記錄都具有位於AUDIO表的任何START/STOP對之間的TSTAMP。

到目前爲止,我已經嘗試過ite以下的口糧:

SELECT FILE FROM POINTS 
WHERE (
TSTAMP 
BETWEEN (SELECT START FROM AUDIO) AND 
(SELECT STOP FROM AUDIO) 
); 

它返回0。我知道這個數據排隊,並給予正確的搜索語句我應該有多個記錄返回。但是,我似乎無法找到任何關於如何解決在一個搜索語句中從多個表中拉列的參考。

我知道我可以在Python中使用這種方法,但它看起來像一般的SQL工作。

還在習慣SQL,所以請在你的答案中明確表示。 感謝

回答

1

查找具有位於AUDIO表的任何START/STOP對之間的TSTAMP的POINTS表中的每條記錄。你可以使用下面的查詢。也請不要使用start作爲列名,這是sqlite中的關鍵字。我用sta你可以改變列名。

選擇STA,STOP, (從點選擇GROUP_CONCAT(POINTS.FILE)其中日期時間(POINTS.TSTAMP)日期時間(AUDIO.STA)和日期時間(AUDIO之間。STOP))作爲FIL 從AUDIO 從AUDIO

這將返回數據的逗號分隔的列表我用下面的數據來檢查

AUDIO 
    STA      STOP 
"2015-12-15T22:37:00" "2015-12-15T22:39:53" 
"2015-12-15T22:27:00" "2015-12-15T22:37:00" 
"2015-12-15T22:17:00" "2015-12-15T22:27:00" 

POINTS 
    TSTAMP     FILE 
"2015-12-15T22:29:54" "L151400.GPS" 
"2015-12-15T22:29:55" "L151400.GPS" 
"2015-12-15T22:29:56" "L151400.GPS" 

And following is the result 
    STA      STOP    FIL      
"2015-12-15T22:37:00" "2015-12-15T22:39:53" "NULL" 

"2015-12-15T22:27:00" "2015-12-15T22:37:00" "L151400.GPS,L151400.GPS,L151400.GPS" 

"2015-12-15T22:17:00" "2015-12-15T22:27:00" "NULL" 

感謝,這將發生在range.Also

+0

最終你的答案的變化做了竅門..謝謝! 從日期時間(AUDIO.START)和日期時間(AUDIO.STOP)之間的日期時間(POINTS.TSTAMP)開始,選擇開始,停止(從集合中選擇GROUP_CONCAT(AUDIO.FILE))作爲來自音頻 –

-1

Between是假設有兩個值來使用,如:

BETWEEN A AND B 

您使用子查詢,填寫AB,這是很好的,但這些子查詢返回不止1值,這就是你的問題所在。

SELECT START FROM AUDIO 

返回結果:

"2015-12-15T22:37:00" 
"2015-12-15T22:27:00" 
"2015-12-15T22:17:00" 

在這種情況下,Between正在試圖找出 「這3個日期,這些日期之間」。沒有意義。你需要確保你的子查詢只返回1個結果。

除此之外,您使用TSTAMP BETWEEN A AND B並沒有錯。

+0

會如何我爲每個條款條件定義了一個值? 會像(選擇從音頻AS AUDIO_START開始)訣竅?或者是否有更多的內容符合這個觀點? –

+0

'AS'關鍵字不會對任何事情有所幫助,只是爲了標記結果。如果您想通過每次啓動和停止配對來運行查詢,則必須將它們視爲單獨的查詢。我不確定是否值得花時間在sql中創建一個巨大的循環。相反,我建議無論你從哪裏運行SQL,都要先獲取所有開始/停止行並遍歷它們,每次迭代都會將這些值插入到實際需要的查詢中。那有意義嗎? – Coderchu

+0

這就是我在這裏工作,因爲我監視這個線程。很高興我可以得到一些驗證。在Python中它相當簡單,只是因爲SQL的速度而浪費太多。感謝您的建議。 –

1

,以配合可能多個匹配行,使用聯接:

SELECT Points.File 
FROM Points 
JOIN Audio ON Points.TStamp BETWEEN Audio.Start AND Audio.Stop; 

這將返回一行每場比賽。要刪除重複的文件,請使用DISTINCT。

+0

模棱兩可的列名:文件:SELECT File FROM Points JOIN Audio ON Points.TStamp BETWEEN Audio.Start AND Audio.Stop; –

+0

指定表名使其無歧義。 –

相關問題