从数据库中获取最小值并在MySQL中随机化顺序

时间:2018-10-28 14:10:35

标签: mysql

我有一张戏剧表演的报价表。每个节目可能有多个报价,但我尝试随机抽取价格最低的6个。大概有20余场演出,每场演出约3个优惠,我想以最低的价格购买6个独特的随机演出。

我可以使用ORDER BY price轻松找到最低价格,但这意味着我不能使用ORDER BY RAND()来混淆它们。我怀疑我需要做一个UNION之类的东西,但无法绕开它。

我当前的查询如下:

SELECT * FROM `offers` GROUP BY `showID` ORDER BY `price` LIMIT 6

获得最低的6个价格,GROUP确保有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

不是完整的数据示例,但是在上面的示例中,有三个唯一的节目,所以我希望将ID 1、5和7作为这些节目的最便宜报价,但要以随机顺序返回。在完整的数据集中,大约有20个具有多个要约的独特节目,我只想随机选择其中的六个。

2 个答案:

答案 0 :(得分:0)

这应该有效。但是,如果您是我,则可以在应用程序逻辑中实现此目的,而不是试图将其全部塞入查询中(如果仅出于可读性考虑)。

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
);

答案 1 :(得分:0)

MySQL 8.0.2 and above中,我们可以利用Window Functions。但是,对于较旧的版本,可以使用Derived Tables一种方法。它基本上是一个子选择查询,我们将在其中确定要考虑的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