2016-03-05 18 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()