2012-10-13 148 views
0

我有以下查詢:MySQL的子查詢返回的第一個結果,不是所有的結果

SELECT TrackID, Name, Artist, Album, TotalTime, TrackNumber, TrackCount 
FROM tracks 
WHERE TrackID IN (SELECT Tracks FROM playlists 
        WHERE ID='f8ad830c-e2d6-11e1-99d7-00132094' 
        LIMIT 1) 
ORDER BY Artist, Album, TrackNumber 

執行,從「軌道」返回表的第一行包含從子查詢返回任何結果。截至目前,子查詢返回:

41646,41696,41698,41700,41702,41704,41706,41708,41710,41712 

當我把從子查詢返回到原始查詢上述值,以代替子查詢,它返回我期望所有行。

爲什麼子查詢限制返回第一個結果的結果,但用返回的結果(在PHPMyAdmin中運行時)替換子查詢將返回所有這些結果?

+0

這正在發生,最有可能是因爲你的'Tracks'被選定爲單個文本字符串,而不是像這樣的逗號分隔的數字: ''41646,41696,41698,41700,41702,41704,41706,41708,41710,41712'' – hjpotter92

回答

1

你在你的子查詢中說limit 1。所以,你只有1個trackid,因此只有一個軌道。

您可以將曲目分割成多行,因此對於一個播放列表,您可以擁有與曲目一樣多的行,也可以將曲目字符串拆分爲臨時表格。看看MySQL: Split comma separated list into multiple rows例如或搜索「字符串分割到行」

+0

有一行,用逗號分隔列表。單行包含逗號分隔的列表。但是,我也嘗試刪除LIMIT 1併發生相同的結果。 –

+0

所以'track'有''trackid's逗號分隔嗎? –

+0

是的。這實際上是我用5位數字表示的字符串。 –

2
SELECT TrackID, Name, Artist, Album, TotalTime, TrackNumber, TrackCount 
    FROM tracks 
WHERE FIND_IN_SET(TrackID 
        , (SELECT Tracks 
         FROM playlists 
         WHERE ID='f8ad830c-e2d6-11e1-99d7-00132094' 
         LIMIT 1 
        ) 
       ) > 0 
ORDER BY Artist, Album, TrackNumber 
; 
+0

我不會把它留在這種形式。但是,這可能是最容易理解的,最接近你的嘗試。 –

+0

這個表格有什麼問題?你會如何改善? –

+0

如前所述,將播放列表分解爲每個軌道一行的列表是更自然的結構,並且可能更有效地使用正確的索引,並且在大多數情況下使用簡單的JOIN。 –