2012-12-23 25 views
0

我想知道這是否可以讓MySQL做一個「雙重搜索」;我真的不知道該怎麼說,所以這裏有一個例子:我可以讓MySQL進行「雙重」搜索嗎?

我有一張歌曲信息表(標題,專輯等等等等)。我想獲得專輯中的下一首歌。我有當前歌曲的ID。目前,我得到該行,檢查專輯和跟蹤字段,然後根據專輯字段執行另一個MySQL查詢,並檢查當前版本之後是否存在另一個跟蹤。

我可以在一個查詢中告訴MySQL我想要包含在我所擁有的id行中的所有專輯行?

由於我真的不知道這是否可能或如何描述它,我沒有發現任何有用的堆棧溢出,所以很抱歉,如果已經有類似的東西。

+1

很模糊的描述,自然會導致許多不同類型的答案。你究竟想達到什麼目的?你有一個ID,你想得到該ID和所有後續(下)的記錄?如果是這樣,你可以很容易地使用'WHERE id>給定id'語法,但問題還不夠具體。 – brezanac

+0

這是不公平的@holodoc,OP的母語不是英語,我認爲他們溝通後他們很好。這兩個答案在功能上可以等價,因爲在SQL中通常有很多方法可以做同樣的事情。這也不反映在OP上。 – Ben

+0

@holodoc,我應該提到它,但id與軌道順序無關,它是表中的主鍵。但我完全同意,我可以更具體但是像本說的那樣,我的母語不是英語,我有一些困難來解釋它,我很抱歉 – eephyne

回答

5

您可以使用JOIN獲取您想要的內容。假設你的表有一個鏈接到一張專輯的ID,這樣就可以獲得當前正在監聽的曲目之後的所有內容。

select * 
    from songs a 
    join songs b 
    on a.album_id = b.album_id 
where a.song_id = 1 
    and b.song_id > a.song_id 

很顯然,如果你想在這張專輯的一切,然後刪除第二個條件。如果您想包含正在收聽的曲目,請將>更改爲>=


你剛說:

我應該mentionned,但該ID是不相關的 曲目的順序,這是在探微表的主鍵。

如果是這種情況,那麼b.song_id > a.song_id可能是不正確的。您還沒有給我們完整的模式,但我強烈建議您的songs表包含曲目的播放順序,所以它看起來像(SONG_ID, ALBUM_ID, ALBUM_ORDER, ... more song level info)。然後,您的查詢就會變成:

select * 
    from songs a 
    join songs b 
    on a.album_id = b.album_id 
where a.song_id = 1 
    and b.album_order > a.album_order 
+0

爲我所看到的這一點(剛看過一些文檔)JOIN似乎比子查詢更強大,但是你知道一個更有效的速度和服務器負載? – eephyne

+0

你可能想看看http://stackoverflow.com/questions/2577174/join-vs-subquery – luiges90

+3

他們做不同的事情@eephyne。唯一確定的方法就是在自己的環境中進行測試。如果他們的速度大致相同(他們可能會這樣),那就使用你最懂的東西。 – Ben

2

它看起來像你需要subqueries

SELECT * FROM song_table WHERE album = 
    (SELECT album FROM song_table WHERE id = 12) 

這個查詢得到共享具有id = 12

如果你的子查詢可能返回多行,你需要IN該行的同一專輯中的所有行:

SELECT * FROM song_table WHERE album IN 
    (SELECT album FROM song_table WHERE genre = "Techno") 

此查詢獲取所有具有專輯的專輯(專輯)包含的行genre = "Techno"(包含(至少一首)Techno歌曲的任何專輯中的所有歌曲)

+0

它正是我想要的,謝謝 – eephyne

0

目前我得到的行中,選中的專輯和田徑場,然後以此爲基礎專輯實地另一個MySQL查詢,並檢查是否有當前此起彼伏的軌道。

它有什麼問題?速度慢,還是不方便,還是太複雜?
你有任何實際的理由去尋找另一種解決方案嗎?

我在想,如果這是可能的,以使MySQL做一個「雙搜索」

即使有一個積極的答案,而不是一切,這是「可能」值得的實現。

您目前的設置簡單明瞭,您可以自己維護。
雖然每個建議的解決方案都很複雜,但需要更多的知識來維護並可能導致一些問題,因爲Mysql在解釋複雜查詢時遇到困難,並且容易使事情變得更糟。

+0

,所以對你來說,最好是在客戶端執行兩個查詢並處理它們,只對mysql服務器執行一個複雜查詢?我同意維護代碼的簡單性,但在服務器負載方面這是更好的? – eephyne

相關問題