如何使用 ORDER BY 在 SQL/MySQL 中查找行
Posted
技术标签:
【中文标题】如何使用 ORDER BY 在 SQL/MySQL 中查找行【英文标题】:How to find rows in SQL / MySQL with ORDER BY 【发布时间】:2013-02-05 10:24:24 【问题描述】:我有一张桌子用户
Name | Poin
==================
user1 | 20
user2 | 30
user3 | 80
user4 | 60
user5 | 10
user6 | 85
我有 SQL 查询
SELECT *
FROM user
ORDER BY poin
看起来数据序列是基于点的。
但是我需要的是这样的数据(比如我是user1):
Position 1 : user6 - 85 point
Position 2 : user3 - 80 point
Position 3 : user4 - 60 point
你是position 5 : user1 - 20 point
更新
我用这个sql
选择 x.name, x.位置 FROM(选择 t.user, @rownum := @rownum + 1 个 AS 位置 来自用户 t JOIN (SELECT @rownum := 0) r ORDER BY t.poin DESC) x 在哪里 x.user = 'user1'
【问题讨论】:
【参考方案1】:这将为user1
提供当前排名:
SELECT count(*) AS rank
FROM user
WHERE poin >= (SELECT poin FROM user WHERE name = 'user1')
这个查询的一个小问题是,如果另一个用户有相同的分数,它将被分配相同的排名——它是否正确,这是值得怀疑的。
如果您想简单地为每个用户添加排名,请使用:
SELECT
@rank:=@rank+1 AS rank,
name,
poin
FROM user,
(SELECT @rank:=0) r
ORDER BY poin DESC
您可以使用此查询的微小变化来获取单个用户的排名,但避免出现相同的排名模糊问题:
SELECT *
FROM (
SELECT
@rank:=@rank+1 AS rank,
name,
poin
FROM user,
(SELECT @rank:=0) r
ORDER BY poin DESC
) x
WHERE name = 'user1'
【讨论】:
感谢@mvp 的回复。我使用你的第一选择。但是当点值等于 User1 时出现了一个小问题。我该如何解决这个.. thx before.. :) 我已经更新了我的答案,提供了一个禁用“领带”的选项 - 所有用户都将拥有唯一的排名,即使他们的分数相同 伟大的..这项工作。为什么我没有想到要进行这样的多个查询:p .... 好的,非常感谢@mvp .. 你的伙伴帮助了.. ;)【参考方案2】:select * from user order by poin desc
希望对你有帮助
【讨论】:
@johannes:是这样吗?您的代码表明您了解查询和所有内容。所以dint做了一个解释【参考方案3】:SELECT * FROM user ORDER BY poin DESC
ORDER
BY 关键字用于按指定列对结果集进行排序。
ORDER BY
关键字默认按升序对记录进行排序。
如果要对记录进行降序排序,可以使用DESC
关键字。
SQL ORDER BY 语法
SELECT column_name(s)
FROM table_name
ORDER BY column_name(s) ASC|DESC
【讨论】:
fauzi 想要的是位置,而不是“order by”的描述。我真的不明白这个答案如何帮助用户。 我理解问题是他想订购用户,我想他只是以位置为例 如果我理解正确,OP 需要用户当前位置(排名)。您的查询根本没有它【参考方案4】:SELECT Name,
Poin,
@rowNum := @rowNum + 1 AS position
FROM user
JOIN (SELECT @rowNum := 0) r
ORDER BY poin;
【讨论】:
感谢您的解决方案,但我无法使用它,因为它必须处理所有数据才能排名【参考方案5】:以下代码:
SELECT count(*) AS rank
FROM user
WHERE poin >= (SELECT poin FROM user WHERE name = 'user1')
当is在不同的行中有双点时出现问题。
【讨论】:
【参考方案6】:SELECT Name,
Poin,
@rowNum := @rowNum + 1 AS position
FROM user
JOIN (SELECT @rowNum := 0) r
ORDER BY poin DESC;
【讨论】:
感谢您的解决方案,但我无法使用它,因为它必须处理所有数据才能排名 @a.fauzi:很高兴听到这个消息。如果这是对您有所帮助并为您带来奇迹的答案,那么只需单击左上角的“右/勾”向下到“-1”滚动条,以便其他用户在短时间内找到它'会寻找确切或相关的答案。以上是关于如何使用 ORDER BY 在 SQL/MySQL 中查找行的主要内容,如果未能解决你的问题,请参考以下文章
如何在具有现有 order by 的表上使用 OVER(ORDER BY())?
如何在 over 函数中使用 partition by 和 order by?