MySQL计算group_concat()导致的列中的公共数据

时间:2015-03-10 20:56:15

标签: mysql group-concat

我试图找到某些作者之间共同的共同作者的数量 - 当作者的名字和姓氏相同而其中一位作者没有中间名时。

在这种情况下,我们有兴趣找到作者共同的共同作者的数量,中间名作者没有中间名。

例如,[link] http://www.sqlfiddle.com/#!9/75243/1

在此表中,我们的作者有多个中间名,但名字和姓氏相同,即JACK SMITH, JACK A SMITH, JACK B SMITH。我们有兴趣找到

共有的共同作者的数量
1. JACK SMITH with JACK A SMITH
2. JACK SMITH with JACK B SMITH

结果将包括num字段结果

JACK A SMITH  1
JACK B SMITH  0

由于JACK A SMITH有一位共同作者与JACK SMITH有共同点,JACK B SMITH没有与JACK SMITH共有的共同作者。

2 个答案:

答案 0 :(得分:1)

您可以将COUNT(DISTINCT ...)与多列一起使用。因此,您可以使用它来计算不同的全名,而无需首先将它们连接起来。

SELECT s1.fname, s1.mname, s1.lname, s1.name, COUNT(DISTINCT s2.fname, s2.mname, s2.lname) as num
FROM ( SELECT title, fname, mname, lname, CONCAT(fname, ' ',mname, ' ', lname) as name
  FROM sample ) as s1
LEFT JOIN sample AS s2
ON s1.title = s2.title AND s1.fname = s2.fname AND s1.lname = s2.lname AND s1.mname != s2.mname 
WHERE s1.mname != ''
GROUP BY s1.name
ORDER BY s1.lname, s1.fname, s1.mname 

我使用了LEFT JOIN而不是JOIN来获取零共作者的行。

答案 1 :(得分:0)

你应该只需要添加一个COUNT ...

SELECT s1.fname, s1.mname, s1.lname, s1.name, GROUP_CONCAT(DISTINCT s2.name) as coauthor, COUNT(DISTINCT s2.name) as num
FROM ( SELECT title, fname, mname, lname, CONCAT(fname, ' ', IF(mname is null, '', CONCAT(mname, ' ')), lname) as name
  FROM sample ) as s1
JOIN ( SELECT title, fname, mname, lname, CONCAT(fname, ' ', IF(mname is null, '', CONCAT(mname, ' ')), lname) as name
  FROM sample ) AS s2
ON s1.title = s2.title AND s1.name != s2.name
GROUP BY s1.name
ORDER BY s1.lname, s1.fname, s1.mname