我經常發現自己正在執行幾個獨立的加入表中。例如,假設我們有表collections
,它與photos
和songs
都有獨立的一對一關係,其中N從零到很多。而不是獨立加入多個表,使用單獨的查詢?
現在,假設我們想獲得一個收藏,並且都是其(獨立)相關的照片和歌曲。
我通常會使用這樣的:
SELECT
collections.collectionid as collectionid,
photos.name as photo_name,
songs.name as song_name
FROM collections
LEFT JOIN photos ON collections.collectionid = photos.collectionid
LEFT JOIN songs ON collections.collectionid = songs.collectionid
WHERE collections.collectionid = 14
當然,左加入一個表,其他兩個表,如果第一個加入M
行和N
行的第二個結果,給M * N
行。這在數據庫流量和性能方面看起來並不理想。
+--------------+------------+-----------+
| collectionid | photo_name | song_name |
+--------------+------------+-----------+
| 14 | 'x' | 'a' | \
| 14 | 'x' | 'b' | - Each photo is returned 3 times,
| 14 | 'x' | 'c' |/because 3 songs are returned.
| 14 | 'y' | 'a' | \
| 14 | 'y' | 'b' |
| 14 | 'y' | 'c' |/
+--------------+------------+-----------+
或者,可以執行兩種選擇:兩個單獨的查詢,每個接合collections
到一個不同的表,給M + N
行:
SELECT
collections.collectionid as collectionid
song.name as song_name
FROM collections
LEFT JOIN songs on collections.collectionid = songs.collectionid
WHERE collections.collectionid = 14
和:
SELECT
collections.collectionid as collectionid
photos.name as photo_name
FROM collections
LEFT JOIN photos on collections.collectionid = photos.collectionid
WHERE collections.collectionid = 14
給出:
+--------------+------------+ +--------------+------------+
| collectionid | song_name | | collectionid | photo_name |
+--------------+------------+ +--------------+------------+
| 14 | 'a' | | 14 | 'x' |
| 14 | 'b' | | 14 | 'y' |
| 14 | 'c' | +--------------+------------+
+--------------+------------+
我的問題:處理這個問題的最佳方法是什麼?
以上都不是最佳。那麼,有沒有另外一種方法可以產生M + N
行,但可以在單個查詢中完成?
在MySQL中,您可以使用`group_concat`爲每個組返回1行。不瞭解性能影響。 – 2011-01-30 23:38:07
謝謝馬丁。哇,時髦。據我所知,這些數據彙總後的結果 - 因此不會改變查詢本身的「M *」性能問題。但是,因爲它減少了行數,所以它應該減少循環的長度,在PHP中稱,調用`mysql_fetch_assoc`。 – 2011-01-30 23:57:37
這就是連接如何在SQL中工作,如果不需要此結果,則幾乎需要2個查詢。 – nos 2011-01-31 18:37:21