我有一张戏剧表演的报价表。每个节目可能有多个报价,但我尝试随机抽取价格最低的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个具有多个要约的独特节目,我只想随机选择其中的六个。
答案 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