以下查询功能完备,查询单个表以查找通过顺序userid
数字列添加的最后50个用户名。
到目前为止的逻辑是:找出最高的用户ID;从中减去50;将用户名拉回到更大的位置。
然而,它看起来并不优雅,并使用两个子查询来实现它的目标:
SELECT username
FROM table
WHERE userid IN
(SELECT userid
FROM table
WHERE userid >
(SELECT MAX(userid) -50
FROM table))
有没有办法让它更少嵌套?更高效?更优雅?任何帮助将不胜感激,因为这不是最好的方式!
干杯&非常感谢 阿里
答案 0 :(得分:6)
提供的答案是正确的。 您可以使用ROWNUM选择TOP-N样式结果。
请注意,请注意在预测之后但在ORDER BY之前将rownum分配给查询结果。尝试以下内容:
SELECT username
FROM
(SELECT username
FROM table
ORDER BY userid DESC)
WHERE rownum <= 50
答案 1 :(得分:2)
SELECT * FROM (SELECT UserName FROM Table ORDER BY UserID DESC)
WHERE RowNum <= 50
......我想......自从我摆弄甲骨文以来已经有一段时间了。
这与
大致相同 SQL Server中的 SELECT Top 50
和
MySql中的 SELECT ... LIMIT
50
答案 2 :(得分:2)
您可以使用ROW_NUMBER()根据其在有序列表中的位置为每一行分配一个数字。例如,要为最高用户标识的行开头编号:
SELECT username
FROM (
SELECT
ROW_NUMBER() OVER (ORDER BY user_id DESC) AS RowNr,
*
FROM users
) sub
WHERE RowNr < 50
与问题中的查询不同,如果userid不连续,这将有效。
答案 3 :(得分:1)
纯粹为了审美,我使用SQLinForm这是一个Java applet,可以很好地格式化你的SQL。它也很灵活,有很多选项。
答案 4 :(得分:0)
取决于您使用的数据库,但请尝试以下方法:
预言: 从表中选择用户名rownum&lt; 50用户订单;
的PostgreSQL: 通过userid limit 10;
从表顺序中选择用户名答案 5 :(得分:0)
怎么样:
SELECT username FROM table ORDER BY userid DESC LIMIT 50
答案 6 :(得分:0)
如果您在用户表中有一个DateCreated字段,则可以进行如下查询:
SELECT TOP 50 username
FROM table
ORDER BY DateCreated DESC