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。 firstname
和 lastname
上的匹配条件然后添加 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.'
所以子查询是必要的。
我在查询中使用 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。 firstname
和 lastname
上的匹配条件然后添加 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.'
所以子查询是必要的。