2016-03-05 21 views
0

我很關心優化我的查詢,只要查詢後從數據庫發回的數據量。避免MySQL查詢吃掉不必要的帶寬

假設我有兩張桌子。一個叫「藝術家」另一個叫「專輯」

比方說, 「藝術家」表列是:ID

「專輯」表列是:IDartist_id冠軍

假設我想要一個頁面來顯示藝術家的名字作爲標題。然後在下面,我想顯示藝術家專輯的列表。

我可以通過做這樣的事情很容易做到:

SELECT artists.name AS artist_name, albums.title AS album_title 
LEFT JOIN albums 
ON albums.artist_id = artists.id 
WHERE artists.id = 3; 

這給我一個結果,可能是這個樣子:

artist_name   | album_title 
        | 
Justin Bieber  | My First Crappy Album 
Justin Bieber  | Another Crappy Album 
Justin Bieber  | Yet Another Crappy Album 

對這一結果的問題是,它給我多次回到藝術家的名字,當我真的只需要一次。我擔心這種做事方式效率不高。特別是如果藝術家已經有很多專輯。我可能是錯的,如果我是,有人請糾正我。

無論如何,有沒有更好的方法來做到這一點?一個我不必多次檢索藝術家名字的地方?

+1

是的,我不會說那個「優化」。如果它讓你感覺更好,把專輯名稱放在左邊,藝術家名字在右邊。這是你從查詢中得到的東西,知道我的意思嗎? –

回答

0

您可以使用聚合函數。

SELECT ar.name AS artist_name, GROUP_CONCAT(al.title) AS album_titles 
FROM artists ar, albums al 
WHERE ar.id = al.artist_id 
AND ar.id = 3 
GROUP BY artist_name; 

這應該給你這樣的:

artist_name   | album_titles 
Justin Bieber  | Album1, Album2, Album3 

我沒有用的,而此命令,但你可以在這裏找到它更多的文檔:http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

另外,我更喜歡在FROM子句中列出我的表並使用WHERE子句來加入它們,但它與上面的JOIN相同......只是一種不同的語法。

0

然後做兩個單獨的請求。 首先要求藝術家姓名

SELECT name 
FROM artists 
WHERE id = 3 

然後專輯冠軍。

SELECT title 
FROM albums 
WHERE artist_id = 3 

我不知道PHP內的任何帶寬記錄,但你可以計算出女巫方式是最快的使用執行microtime()