我试图找到某些作者之间共同的共同作者的数量 - 当作者的名字和姓氏相同而其中一位作者没有中间名时。
在这种情况下,我们有兴趣找到作者共同的共同作者的数量,中间名作者没有中间名。
例如,[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
共有的共同作者。
答案 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