0

我正在尝试获取某个作者的所有合著者。第一列是出版物的 id。接下来的三列是作者的名字、中间名和姓氏。

4 KARL K KWON
4 JACK A SMITH  
4 DINESH  SMITH  
5 KARL K KWON
5 JACK B SMITH
6 AMEY SCHENCK BAILEY
6 KARL K KWON
6 DINESH  SMITH
6 JACK  SMITH
13 JACK  SMITH
13 RONALD  VALE

我想得到以下输出

JACK A SMITH {DINESH SMITH, KARL K KWON}
JACK B SMITH {KARL K KWON}
JACK  SMITH {AMEY SCHENCK, KARL K KWON, DINESH SMITH, RONALD  VALE}

我无法理解使用哪种结构来存储这些新数据以及如何获取它。任何建议/想法...

编辑

这不是按发布 ID 进行的简单分组。例如,JACK SMITH 在这里有 2 个出版物,id 为 6 和 13。因此,需要找到这两个出版物的合著者并将其添加到我们的 JACK SMITH 合著者集中。

4

2 回答 2

0

这不是完全相同的格式,但它会吗?

编辑 尝试#2:

添加这些索引:

INDEX(pub_id, name)
INDEX(name, pub_id)

这是查询,我认为这个自连接应该可以解决问题:

SELECT  a.name AS Author,
        GROUP_CONCAT(DISTINCT c.name SEPARATOR ', ') AS Co_authors
    FROM  ( SELECT  DISTINCT name FROM  tbl ) AS a  -- Get the authors
    JOIN  tbl b ON (b.name = a.name)                -- Get what they published
    JOIN  tbl c ON (c.pub_id = b.pub_id)            -- Get the co-authors
    GROUP BY  a.name;
于 2015-03-05T05:19:31.977 回答
0

这将返回 id 和逗号分隔的作者列表

SELECT id, GROUP_CONCAT(CONCAT_WS(' ', firstName, middleName, lastName)) FROM table GROUP BY id

将上面的表加入到表中

SELECT t.*, tGrouped.authors  FROM table t
JOIN (SELECT id, GROUP_CONCAT(CONCAT_WS(' ', firstName, middleName, lastName)) as authors FROM table GROUP BY id) tGrouped ON t.id=tGrouped.id

最后,如果您不希望名称出现在作者列表中 - 使用简单REPLACE()

于 2015-03-10T07:07:30.180 回答