MySQL多个连接和计数不同

时间:2016-02-04 08:18:38

标签: mysql

我需要编写连接多个表的查询,我需要根据max count()从一个表中获取不同的值。

这些是我的表名和列:

bands:
db|name|

releases_artists:
release_db|band_db

releases_styles
release_db|style

表之间的关系是(JOIN需要):

releases_artists.band_db = bands.db
releases_styles.release_db = releases_artists.release_db

现在我需要写的查询:

SELECT b.name, most_common_style
LEFT JOIN releases_artists ra ON ra.band_db = b.db

and here I need to find the most common style from all band releases

JOIN(
    SELECT DISTINCT style WHERE releases_styles.release_db = ra.release_db ORDER BY COUNT() DESC LIMIT 1
)

FROM bands b
WHERE b.name LIKE 'something'

这只是我想要完成的一个非工作的例子。如果有人可以帮我构建这个查询,那就太棒了。

提前致谢。

编辑1

来自表格bands的每位艺术家可以根据releases_artistsband_db表格中获得多条记录,并且每个版本都可以基于releases_styles来自release_db的多个样式

因此,如果我搜索b.name LIKE'%ray%',它会返回类似于:

的内容
`bands`:
o7te|Ray Wilson
9i84|Ray Parkey Jr.

`releases_artists` for Ray Wilson:
tv5c|o7te (for example album `Change`)
78wz|o7te (`The Next Best Thing`)
nz7c|o7te (`Propaganda Man`)

`releases_styles`
tv5c|Pop
tv5c|Rock
tv5c|Alternative Pop/Rock
----
78wz|Rock
78wz|Pop
78wz|Classic Rock

我需要的样式名称主要来自所有艺术家的发布,作为这位艺术家的主要风格。

1 个答案:

答案 0 :(得分:1)

好的,这有点像黑客。但我能想到的唯一选择涉及大量嵌套子查询。所以这里:

SELECT name
     , SUBSTRING_INDEX(GROUP_CONCAT(style ORDER BY release_count DESC SEPARATOR '|'), '|', 1) AS most_common_style
  FROM (
        SELECT b.db
             , b.name
             , rs.style
             , COUNT(*) AS release_count
          FROM bands b
          JOIN releases_artists ra ON ra.band_db = b.db
          JOIN releases_styles rs ON rs.release_db = ra.release_db
         GROUP BY b.db, rs.style
       ) s
 GROUP BY db;