我有一张剧院演出的报价表。每个节目可能有不止一个报价,但我想随机抽取6个最低价格的。可能有大约20多场演出,每场演出约有3个报价,我想要6场独特的随机演出的最低价格。
我可以很容易地通过订购找到最低的价格 price
,但这意味着我不能使用order by rand()来混淆它们。我怀疑我需要做一个工会什么的,但我不能让我的头周围。
我当前的查询如下所示:
SELECT * FROM `offers` GROUP BY `showID` ORDER BY `price` LIMIT 6
这就得到了6个最低的价格,集团确保它是6个不同的节目,但总是相同的6个节目。如果我试试这个:
SELECT * FROM `offers` GROUP BY `showID` ORDER BY RAND() LIMIT 6
我随机得到6个节目,但不一定是最低价。我如何结合这些得到最低价格和随机结果?
编辑以添加请求的示例数据:
id | showID | offer | price
1 | 1234 | 10% Off Band A | 15.00
2 | 1234 | 15% Off Band B | 25.00
3 | 4321 | 10% Off Band B | 20.00
4 | 1234 | 25% Off Band C | 30.00
5 | 6666 | Free Upgrade | 13.00
6 | 6666 | Premium Seats | 40.00
7 | 4321 | Half Price | 12.00
不是一个完整的数据样本,但在上面的例子中有三个独特的节目,所以我想IDS1,5和7作为这些节目最便宜的报价,但返回的顺序是随机的。在完整的数据集中,大约有20个独特的节目有多个优惠,我只想随机其中6个。
2条答案
按热度按时间zbq4xfa01#
在mysql 8.0.2及更高版本中,我们可以使用窗口函数。但是对于旧版本,一种方法是使用派生表。它基本上是一个子选择查询,我们将在其中标识6个随机变量
showID
要考虑的价值。现在,我们需要对应于最低价格的完整行。因此,在另一个派生表中,我们将确定
showID
.然后,我们只需将这些结果集连接到主表,就可以得到对应于6个随机变量的最低价格的行
showID
价值观。w8ntj3qf2#
这应该管用。然而,如果我是你,我会在应用程序逻辑中实现这一点,而不是试图将其全部塞进一个查询中,哪怕只是为了可读性。