如何使用 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 RAND() 似乎不是随机的

如何在具有现有 order by 的表上使用 OVER(ORDER BY())?

使用 distinct 后如何执行 order_by?

如何在 over 函数中使用 partition by 和 order by?

php查询使用“Order By .... Limit”后如何使用“Order by”?

SQL如何使用order by语句查询数据表的多字段