2009-09-16 81 views
0

這是我經常碰到的一個問題,我的解決方案總是要運行大量的查詢,但我覺得必須有更好的方法。這裏是我的兩個表這個例子:如何在列表中獲取列表(類似於多維數組)?

藝術家
ID

歌曲
ID
artistID

流派

錶鏈接爲這樣:
artists.id < - > songs.artistID

我想獲取所有藝術家的列表,並在同一時間內獲取每個藝術家的所有歌曲的列表。我想在結果集中避免重複的藝術家名稱,這樣我就不必清除PHP中的數據集。這裏的格式的一個例子,我想數據是在:

array(0 => array('name' => 'Artist A' 
        , 'songs' => array(0 => array('name' => 'Song 1' 
               , 'genre' => 'rock' 
               ) 
            ) 
            1 => array('name' => 'Song 2' 
               , 'genre' => 'rock' 
               ) 
            ) 
       ) 
     1 => array('name' => 'Artist B' 
        , 'songs' => array(0 => array('name' => 'Song 3' 
               , 'genre' => 'rap' 
               ) 
            ) 
            1 => array('name' => 'Song 4' 
               , 'genre' => 'rap' 
               ) 
            ) 
       ) 
    ) 

(我知道這是不是一個MySQL的格式,但它是我可以解釋最近的樣子)

這是可能的?如果是這樣,怎麼樣?

謝謝!

回答

1

我可以建議最好的事情是對父記錄,然後使用一個在(父ID列表)查詢孩子的查詢的查詢。這會給你兩個數據集。一個給父母,一個給孩子。在客戶端,您可以獲取父ID並獲取一組子記錄。

+0

我不是很熟悉的IN子句,但我會考慮它。謝謝。 – 2009-09-17 00:43:50

+0

SELECT * FROM表1凡Table1ID IN(1,2,3,4,5,6) 可以做同樣的SELECT * FROM SONGS WHERE ArtistID IN(1,2,3,4)。如果你有藝術家屈指可數然後你可以通過自己的ID列表中選擇關閉獲得該藝術家的所有歌曲(或者你可以做一個直接連接)。但是,與藝術家的集合,他們的歌曲的集合,你應該能夠實現你要找的事情。 – 2009-09-18 18:16:43

0

恐怕也不可能做你想要什麼,因爲SQL本質上是一個基於集合的語言。通過使用表連接,您可以在一次調用中獲取所有要查找的信息,但在此之後,您必須解析它們並將它們存儲到您提到的結構中。

1

選項1:

  1. 查詢藝術家表
  2. 對於每個藝術家:
    1. 存儲中的信息到一個數組。
    2. 查詢歌曲表並附結果到陣列

優點:
沒有不必要的信息從數據庫中傳遞。

CON:
潛在的許多和大量的查詢正在運行。

選項2:

  1. 查詢兩個表使用JOIN(也許是左連接將是最好的),以便通過藝術家
  2. 對於每一行:
    1. 檢查該行的藝術家與最後一張相同:
      • 如果沒有,則將藝術家信息存儲到數組的頂層
    2. Store中的歌曲信息到藝術家的陣列的子陣列

優點:所需
只有一個查詢。

CON:
從數據庫傳遞的潛在的大量和不必要的數據。

+0

方案2是混亂的,但可能與數據庫工作方面更有效率。謝謝。 – 2009-09-17 01:59:46