【问题标题】:MySQL combine two columns and list all doubles on those columnsMySQL合并两列并列出这些列上的所有双精度
【发布时间】:2021-12-30 23:12:20
【问题描述】:

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

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

问题

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

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

代码

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

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

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

【问题讨论】:

  • 您的查询group by 对标准SQL 无效,请参阅mysql_only_full_group_by,但是您可以在group by 中重复CONCAT(firstname,' ', lastname)
  • 很好的信息,但它仍然不会只选择具有相同名字和姓氏的人。它现在给出相同姓氏的结果。
  • 在您的问题中添加一些示例数据和所需的结果。如果您使用的是 MySql 8+,则可以使用 count() over a window

标签: mysql concatenation


【解决方案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

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

或者,如果您使用的是 MySQL v8(或支持窗口函数的 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 () 窗口函数然后将其作为子查询。请注意,您不能直接在查询中使用HAVING cnt > 1,因为它会返回错误

错误 3594:您不能在此上下文中使用包含窗口函数的表达式的别名“cnt”。'

所以子查询是必要的。

Demo fiddle

【讨论】:

  • 这:“修改您尝试的查询以成为子查询[...]”可能是我见过的解释子查询使用的最佳解释。太感谢了!这完全符合我的需要。我只需要省略一些空白字段并添加订单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2012-01-23
  • 2012-11-06
  • 2019-01-14
相关资源
最近更新 更多