MySQL: combining multiple values after a join into

2019-04-05 12:15发布

I have a database with a table for publications, each of which can have multiple authors that are stored in a different table. I'd like to query the database into giving me a list of publication titles in one column, and the combined authors for that publication in the second.

SELECT p.`id`, p.`title`, a.`fullname` 
from `publications` p 
LEFT JOIN `authors` a on a.`publication_id` = p.`id`;

This of course gives me multiple times the publication title for as many authors.

id   title              fullname
--   -----              --------
1    Beneath the Skin   Sean French
1    Beneath the Skin   Nicci Gerrard
2    The Talisman       Stephen King
2    The Talisman       Peter Straub

Grouping on id gives me one author per title:

SELECT p.`id`, p.`title`, a.`fullname` 
from `publications` p 
LEFT JOIN `authors` a on a.`publication_id` = p.`id` 
GROUP BY a.`id`;

id   title              fullname
--   -----              --------
1    Beneath the Skin   Sean French
2    The Talisman       Stephen King

The result I'm looking for is this:

id   title              fullname
--   -----              --------
1    Beneath the Skin   Sean French, Nicci Gerrard
2    The Talisman       Stephen King, Peter Straub

I think the answer should be found in using GROUP_CONCAT, but the only result I'm able to get is one result row with all authors:

SELECT p.`id`, p.`title`, GROUP_CONCAT(a.`fullname`) from `publications` p 
LEFT JOIN `authors` a on a.`publication_id` = p.`id` 
GROUP BY a.`id`;

id   title              fullname
--   -----              --------
1    Beneath the Skin   Sean French, Nicci Gerrard, Stephen King, Peter Straub

And using GROUP_CONCAT after the join gives me an "Every derived table must have its own alias" error.

SELECT p.`id`, p.`title`, a.`fullname` 
FROM `publications` p 
LEFT JOIN (SELECT GROUP_CONCAT(a.`fullname`) FROM `authors` a) ON a.`publication_id` = p.`id`;

Any clues?

2条回答
走好不送
2楼-- · 2019-04-05 12:46

Stuart's answer is fine. This is just to show the working version of your approach:

SELECT p.`id`, p.`title`, a.`fullname`
FROM `publications` p LEFT JOIN
      (SELECT publication_id, GROUP_CONCAT(a.`fullname` separator ', ')
       FROM `authors` a
       GROUP BY publication_id
      ) a
--------^
      ON a.`publication_id` = p.`id`;

The error you got was because the a was missing after the subquery. The subquery also needed to be fixed, to include publication_id in the select and a group by clause.

查看更多
甜甜的少女心
3楼-- · 2019-04-05 12:59

You need to group by all of the non-aggregated columns in the SELECT columns (and explicitly, not the author id, because author.id is not part of the select list):

SELECT p.`id`, p.`title`, GROUP_CONCAT(a.`fullname` separator ', ')
from `publications` p 
LEFT JOIN `authors` a on a.`publication_id` = p.`id` 
GROUP BY p.`id`, p.`title`;
查看更多
登录 后发表回答