【问题标题】:SQL Ordering rows in a select with multiple conditions具有多个条件的选择中的 SQL 排序行
【发布时间】:2020-01-31 02:16:03
【问题描述】:

我正在尝试创建一个 SQL 查询来从数据库中选择行,按数字字段排序,但是表中有重复的条目。 该表由以下列组成。

UID - 数字唯一 ID

ACCOUNT_NAME - 账户名,不变

NICK_NAME - 用户可以随时更改

POINTS - 记录用户账户持有的积分

查询的目标是显示按积分排序的 Account_Name。但是,Account_Name 不是唯一的,可以在表中出现多次。 为了解决这个问题,我想只显示每个 Account_Name 的最新行。 这意味着在选择结果中每个 Account_Name 应该只出现一次。我试图让选择由 UID 决定,这意味着我只想要显示每个 account_name 的具有最大 UID 的行。

我尝试了以下方法,但没有得到想要的结果。 (表名ACCOUNT

SELECT DISTINCT A.account_name , A.uid, A.points
FROM account A, account B
where A.account_name = B.account_name 
and A.points > 0
and A.uid >= B.uid
order by A.points DESC;

这并没有给我想要的结果,具体来说,数据库中有一个帐户,其中存在 Points 列中具有高值的过时行。此记录显示为选择中的第一个结果,即使它已过时。

您建议如何调整此查询以选择所需的信息?

我希望这是足够的信息来解决(第一次发布问题)谢谢你的帮助:)

编辑:添加数据示例。

示例表数据: Sample Table Data

当前结果: Current Results

期望的结果: Desired Results

【问题讨论】:

  • 样本数据和期望的结果真的很有帮助。
  • 当然,我会尽快更新示例。
  • 是什么让唱片“过时”?您可能希望在 WHERE 子句中添加一个“and”条件,以过滤掉过时的记录。
  • 当表中有另一条记录具有相同的ACCOUNT_NAME但更大的UID时,该记录已过期

标签: mysql sql select


【解决方案1】:

考虑加入聚合查询计算MAX(UID)

SELECT a.account_name, a.uid, a.points
FROM account a
INNER JOIN 
  (
   SELECT account_name, MAX(uid) AS max_uid
   FROM account
   GROUP BY account_name
  ) agg 
  ON a.account_name = agg.account_name
  AND a.uid = agg.max_uid)
WHERE a.points > 0  
ORDER by a.points DESC;

或者,对于 MySQL 8.0,考虑window function

SELECT a.account_name, a.uid, a.points
FROM account a    
WHERE a.points > 0  
  AND a.uid = MAX(a.uid) OVER (PARTITION BY a.account_name)
ORDER by a.points DESC;

【讨论】:

    猜你喜欢
    • 2017-06-05
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 2013-11-18
    • 1970-01-01
    相关资源
    最近更新 更多