选择MySQL中的随机最大值

选择MySQL中的随机最大值,mysql,Mysql,我有这张桌子: id name bid 1 Test1 5.50 2 Test2 5.50 3 Test3 5.49 我想选择出价最高的行。如果另一行的最高出价相等,则应随机选择最高出价行之一 我试过: SELECT name,max(bid) FROM table ORDER BY rand() 输出: id name bid 1 Test1 5.50 我的问题是id“2”从未显示,因为出于某种原因,我的查询只选择i

我有这张桌子:

id    name    bid
1     Test1   5.50
2     Test2   5.50
3     Test3   5.49
我想选择出价最高的行。如果另一行的最高出价相等,则应随机选择最高出价行之一

我试过:

SELECT name,max(bid) FROM table ORDER BY rand()
输出:

id    name    bid
1     Test1   5.50
我的问题是id“2”从未显示,因为出于某种原因,我的查询只选择id“1”

我们应该做到这一点。等待更优化的请求^^


我们应该做到这一点。等待更优化的请求^^

这是因为您使用的是聚合函数,它将所有内容压缩到一行中。您需要一个子选择:

SELECT *
FROM table
WHERE bid = (SELECT MAX(bid) FROM table)
ORDER BY rand()
LIMIT 1;

但也要注意。虽然只有少量结果,但性能影响可能不足以影响更改。

这是因为您使用的是聚合函数,它将所有内容折叠成一行。您需要一个子选择:

SELECT *
FROM table
WHERE bid = (SELECT MAX(bid) FROM table)
ORDER BY rand()
LIMIT 1;

但也要注意。虽然只有少数几个结果,但性能影响可能不足以影响更改。

在同一查询中选择
name
MAX(bid)
毫无意义:您要求的是所有行中聚合的最高出价,加上未聚合的名称,因此,您将选择哪一行的名称一点也不清楚。MySQL通常会选择您想要的“正确”答案(拥有最高出价的行之一),但这并不能保证,在所有其他数据库中都会失败,并且在ANSI SQL中无效

要获得最高出价行,请按出价排序并仅选择第一个结果。如果要确保获得随机最高出价行,而不是任意出价行,请在order子句中添加随机因子:

SELECT name, bid
FROM table
ORDER BY bid DESC, RAND()
LIMIT 1

在同一查询中选择
name
MAX(bid)
没有任何意义:您要求的是所有行中聚合的最高出价,加上未聚合的名称,因此根本不清楚要选择哪一行的名称。MySQL通常会选择您想要的“正确”答案(拥有最高出价的行之一),但这并不能保证,在所有其他数据库中都会失败,并且在ANSI SQL中无效

要获得最高出价行,请按出价排序并仅选择第一个结果。如果要确保获得随机最高出价行,而不是任意出价行,请在order子句中添加随机因子:

SELECT name, bid
FROM table
ORDER BY bid DESC, RAND()
LIMIT 1

唉。它是如何失败的?老兄,我厌倦了问这个问题。坚持住,保罗。你的技能非常宝贵,急需。我的错。你是对的。我已经用更多的细节更新了我的问题。叹气。它是如何失败的?老兄,我厌倦了问这个问题。坚持住,保罗。你的技能非常宝贵,急需。我的错。你是对的。我用更多的细节更新了我的问题。你太棒了!这个答案比Flimzy和MatTheCat的答案略为优化。这个答案比我和MatTheCat提供的答案优化程度要低。。。。阅读我答案中链接的文章,了解原因。Flimzy的答案=查询耗时0.0056秒——bobince的答案=查询耗时0.0032秒sec@reefine如果你需要一个性能,那么这个查询不是一个好办法。但它看起来真的很漂亮。它针对代码读取器进行了优化:)就性能而言,使用ORDER BY搜索的行只有3-5行,因此性能更好。我的假设正确吗?(我是一个表演n00b)你太棒了!这个答案比Flimzy和MatTheCat的答案略为优化。这个答案比我和MatTheCat提供的答案优化程度要低。。。。阅读我答案中链接的文章,了解原因。Flimzy的答案=查询耗时0.0056秒——bobince的答案=查询耗时0.0032秒sec@reefine如果你需要一个性能,那么这个查询不是一个好办法。但它看起来真的很漂亮。它针对代码读取器进行了优化:)就性能而言,使用ORDER BY搜索的行只有3-5行,因此性能更好。我的假设正确吗?(我是一名表演n00b)