【问题标题】:How to move ID of duplicate names to a separate column如何将重复名称的 ID 移动到单独的列
【发布时间】:2022-01-13 14:18:16
【问题描述】:

我有一个 MySQL 表有两个重名,如何将重名的 ID 分隔到单独的列中?

   ---------------------------------
   | id   | name       | surname   |
   ---------------------------------     
   |  557 | Logan      | Smith     |
   | 1052 | Logan      | Smith     |
   ---------------------------------

例如,像这样:

   ----------------------------------------
   | id   |  id2  | name      | surname   |
   ----------------------------------------     
   | 557  |  1052 | Logan     | Smith     |
   ----------------------------------------

这是我当前在第一个表中检索当前结果的 SQL 语句:

SELECT userid as id, name, surname
FROM user
WHERE name = "Logan"
GROUP BY userid

每个名字最多只能重复一个。

谢谢

【问题讨论】:

  • 也许您可以使用 mysql group_concat,它不会将第二个 Id 移动到新列,但如果您对同一个人有超过 2 条记录,它会起作用。 stackoverflow.com/questions/9456380/…
  • 嗨!好问题!您是否正在尝试解决这一特定情况,仅针对name = Logan?是只有一个重复还是可以有很多?根据您的用例会有不同的答案
  • @jarlh 我的错,我忘了删除它
  • @EoinS 您好,是的,还有更多条目,这只是问题的一个具体示例。但是每个名字只有一个重复
  • 如果“数据库外部”解决方案是一个选项,您可以首先找出哪些数据库条目具有相同的名称,将它们存储在某种变量中,然后将它们移动到另一个表中.但是你将如何处理三个相同的名字呢?

标签: mysql sql mariadb


【解决方案1】:

如果您确定最大值始终为 2... 那么您可以:

SELECT min(userid) as id1, max(userid) as id2, name, surname
FROM user
WHERE name = "Logan"
GROUP BY name, surname

如果你想更复杂一点的查询

SELECT min(userid) as id1,
  case when min(userId) = max(userid) then null else max(userId) end as id2, name, surname
FROM user
WHERE name = "Logan"
GROUP BY name, surname

【讨论】:

  • 谢谢!不知道我怎么没想到...您的个人资料图片与当前情况非常相关
【解决方案2】:

你可以使用类似的东西:

with cte as (
   select 
       row_number() over (partition by name, surname order by user_id)  rn, 
       name,
       surname,
       user_id
    from tt
)
select 
   name,
   surname,
  max(case when rn=1 then user_id end) as id_1, 
  max(case when rn=2 then user_id end) as id_2 
from cte 
group by name, surname

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-18
    • 2020-12-17
    • 1970-01-01
    • 2011-05-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多