Mysql 来自最大集合的随机记录(带有附加约束)
两张表,产品和生产商。我想买一种特定类型的产品,但只能从生产该产品的最高优先级的生产商那里购买,我需要他们的URL。如果多个制作人具有最高优先级,则给予每个制作人同等的被选中机会 例如,我决定买一辆汽车。从下面的示例数据中,本田和福特是优先级最高的汽车,所以在50%的时间内返回本田URL,在50%的时间内返回福特URLMysql 来自最大集合的随机记录(带有附加约束),mysql,Mysql,两张表,产品和生产商。我想买一种特定类型的产品,但只能从生产该产品的最高优先级的生产商那里购买,我需要他们的URL。如果多个制作人具有最高优先级,则给予每个制作人同等的被选中机会 例如,我决定买一辆汽车。从下面的示例数据中,本田和福特是优先级最高的汽车,所以在50%的时间内返回本田URL,在50%的时间内返回福特URL Products Table: | producer_id | product_type | product_url | |-------
Products Table: | producer_id | product_type | product_url |
|-------------|--------------|-----------------|
| 3 | car | wiki.com/a.html |
| 1 | bat | wiki.com/b.html |
| 2 | car | wiki.com/c.html |
| 4 | car | wiki.com/d.html |
| 2 | car | wiki.com/e.html |
Producers Table:| producer_id | producer | priority |
|-------------|----------|----------|
| 1 | wilson | 30 |
| 2 | honda | 20 |
| 3 | mazda | 5 |
| 4 | ford | 20 |
我确信目前的混乱可以简化:
SELECT products.url
FROM products, producers
WHERE products.producer_id = producers.producer_id AND products.product_type = 'car'
AND priority IN
(SELECT MAX(priority)
FROM products, providers
WHERE products.producer_id = producers.producer_id AND
products.product_type = 'car'
)
ORDER BY RAND() LIMIT 1
此外,由于本田有三款中的两款车型具有最高的优先权,它还存在一个问题,即它将在2/3的时间内返回本田的页面
期待学习 如果您只需要一辆车,则应随机化子查询(生产者一个),使其仅返回一个随机生产者,然后从该生产者中选择一个随机产品: 如果有多个生产商具有最高优先级->将为每个人选择一个机会均等的生产商 如果只有一个生产者具有最高优先级->将选择该生产者
如果您需要更多的汽车,并且在主查询中执行例如ORDER BY RAND()LIMIT 2之类的操作,则此选项不起作用。。。它将只从一个生产商中选择所有汽车。在这种情况下,您需要多次重复前面的方法,每次限制为1,这将起作用,但它基本上要求您的查询条件被处理3次。。根据标准,符合最高百分比要求的最内层。接下来,重新应用相同的标准,但只获得不同的生产者。如果在你的样本中,你有一个制造商,而不是一辆汽车,但他们的产品的20%。您不希望该制作人出现在列表中,因此需要再次对其进行资格认证。在这里,你只得到一次本田,一次福特。此查询由rand()排序,限制1得到您希望的50%/50%,无论给定供应商有多少产品可用 最后,最外层只获取与所选提供者匹配的产品URL。现在,标准第三次应用于汽车。。。假设您有“SUV”与“汽车”与“卡车”的额外数据,这两个制造商的所有合法产品。您只对与“汽车”产品关联的URL感兴趣
SELECT products.product_url
FROM
products
join ( select distinct Products.Producer_ID
FROM
products
JOIN producers
on products.producer_id = producers.producer_id
JOIN ( SELECT
MAX(priority) Highest
FROM
products
JOIN producers
on products.producer_id = producers.producer_id
WHERE
products.product_type = 'car'
) HighestPriority
ON producers.Priority = HighestPriority.Highest
WHERE
products.product_type = 'car'
order by
rand()
LIMIT 1 ) PickOne
ON products.producer_id = PickOne.Producer_ID
where
products.product_type = 'car'