【问题标题】:Search for the next user in alphabetical order by last name and id. - Table has multiple duplicate names按姓氏和 id 的字母顺序搜索下一个用户。 - 表有多个重复名称
【发布时间】:2022-07-30 21:21:41
【问题描述】:

我对 SQL 很陌生,我想了解,当表具有重复的姓氏时,如何按字母顺序从表中获取 下一个用户?目前,我已设法按字母顺序浏览列表,但它会跳过重复的名称或陷入永久循环。

有什么建议我应该做/研究来修复我的 SQL 查询中的逻辑吗?

ID > ID - 如果用户 ID 较低,将跳过该用户:

SELECT formID FROM table 
WHERE formID > ? AND 
lastName >= (SELECT lastName FROM table WHERE formID = ?) ORDER BY lastName ASC"

ID 如果姓氏相同,ID 将导致永远循环:

SELECT formID FROM table 
WHERE formID <> ? AND lastName >= (SELECT lastName FROM table WHERE formID = ?) 
ORDER BY lastName ASC"
ID: (column) Last name: (column) Query #1 Query #2
13 Aaron OK OK
64 Billy OK OK
42 Bob Skip OK
83 Smith Ok Loop
97 Smith Ok Loop

编辑:似乎我设法通过稍微修改我的 SQL 代码找到了解决问题的方法。虽然我不太确定使用 LIMIT 1 是否对我的查询有任何更改。

SELECT formID FROM table 
WHERE 
  lastName > (SELECT lastName FROM table WHERE formID = ? ) 
              OR lastName = (SELECT lastName FROM table 
              WHERE formID = ?) 
AND formID <> ? ORDER BY lastName ASC LIMIT 1"

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    您可以尝试使用DENSE_RANK 窗口函数,它允许您为每个唯一的“lastName”值制作排名值。获得此值后,您可以应用自联接来匹配连续的唯一姓氏。

    WITH cte AS (
        SELECT *, 
               DENSE_RANK() OVER(ORDER BY lastname) AS rn
        FROM tab
    )
    SELECT DISTINCT t1.id,
                    t1.lastName,
                    t2.lastName
    FROM      cte t1
    LEFT JOIN cte t2
           ON t2.rn = t1.rn + 1
    

    查看演示here

    【讨论】:

    • 谢谢,我不知道排名功能,我一定会研究一下,并在我有时间进行更改时尽快写下我的结果。
    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2021-12-16
    • 2015-08-01
    • 1970-01-01
    相关资源
    最近更新 更多