mysql中数据库取最小值与随机排序

vyswwuz2  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(350)

我有一张剧院演出的报价表。每个节目可能有不止一个报价,但我想随机抽取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个。

zbq4xfa0

zbq4xfa01#

在mysql 8.0.2及更高版本中,我们可以使用窗口函数。但是对于旧版本,一种方法是使用派生表。它基本上是一个子选择查询,我们将在其中标识6个随机变量 showID 要考虑的价值。
现在,我们需要对应于最低价格的完整行。因此,在另一个派生表中,我们将确定 showID .
然后,我们只需将这些结果集连接到主表,就可以得到对应于6个随机变量的最低价格的行 showID 价值观。

SELECT o.* 
FROM offers AS o 
JOIN 
  (SELECT DISTINCT showID FROM offers ORDER BY RAND() LIMIT 6) AS dt1 
  ON dt1.showID = o.showID 
JOIN 
  (SELECT showID, MIN(price) AS min_price FROM offers GROUP BY showID) AS dt2 
  ON dt2.showID = o.showID AND 
     dt2.min_price = o.price
w8ntj3qf

w8ntj3qf2#

这应该管用。然而,如果我是你,我会在应用程序逻辑中实现这一点,而不是试图将其全部塞进一个查询中,哪怕只是为了可读性。

SELECT * FROM offers WHERE id IN (
  SELECT 
    (SELECT id 
     FROM offers 
     WHERE showID = show_ids.showID 
     AND price = (SELECT MIN(price) FROM offers WHERE showID = show_ids.showID)
     LIMIT 1) offer_id
  FROM (
    SELECT DISTINCT showID 
    FROM offers 
    ORDER BY RAND() LIMIT 6
  ) show_ids
);

相关问题