MySQL 合并两列并列出这些列上的所有双打

MySQL combine two columns and list all doubles on those columns

我在查询中使用 CONCAT 时遇到问题,我将人员的名字和姓氏组合在一起,然后找到具有相同名字和姓氏的其他记录。

(我想将所有找到的 ID 放在一个 PHP 数组中以备后用。)

问题

我似乎无法跳过 GROUP BY。查询给出了找到的双打的正确计数,但我需要所有单独的记录(id 的 + 其他字段)。 MySQL 说我不能使用 'fullname' 因为它不是一个列。我明白了,但那个组合正是我正在寻找的。

当使用其他查询时,我不断得到结果,它在名字和姓氏上都列出双打 - 我希望它在 CONCAT 全名上。

代码

SELECT 
    id,firstname,lastname,artistname, CONCAT(firstname,' ', lastname) as fullname, COUNT(lastname)
FROM
    table
GROUP BY 
    fullname
HAVING 
       (COUNT(lastname) > 1)

所以,代码有效,但我想列出所有单独的记录。

非常感谢任何帮助我走上正确道路的帮助。

你可以这样做:

SELECT A.id, A.firstname, A.lastname, A.artistname,
       CONCAT(A.firstname,' ', A.lastname) AS fullname, cnt
FROM mytable A
JOIN
(SELECT 
    firstname, lastname, COUNT(lastname) cnt
FROM
    mytable
GROUP BY firstname,lastname) B
 ON A.firstname=B.firstname 
 AND A.lastname=B.lastname
WHERE cnt > 1

将您尝试的查询修改为子查询,然后将其加入 table。 firstnamelastname 上的匹配条件然后添加 WHERE cnt > 1 以仅匹配那些计数大于 1 的条件。

或者,如果您使用的是 MySQL v8(或支持 window 功能的 MariaDB),那么请考虑以下方法:

SELECT * 
 FROM
(SELECT 
     id, firstname, lastname, CONCAT(firstname,' ', lastname) AS fullname,
     COUNT(*) OVER (PARTITION BY firstname, lastname) cnt
 FROM mytable) V
 WHERE cnt > 1

使用COUNT() OVER () window 函数然后将其作为子查询。请注意,您不能直接在查询中使用 HAVING cnt > 1,因为它会 return 您出错

Error 3594: You cannot use the alias 'cnt' of an expression containing a window function in this context.'

所以子查询是必要的。

Demo fiddle