两个表,产品和生产者。我想买一种特定类型的产品,但只能从制造它的最高优先级的生产商那里购买,我需要他们的URL。如果多个生产者具有最高优先级,那么给每个生产者提供被选中的平等机会。
我决定买一辆汽车。从下面的示例数据来看,本田和福特是优先级最高的汽车,因此50%的时间返回本田URL,50%返回福特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 |
目前我确信可以简化:#/ p>
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 / 3rds的时间,因为本田有三个优先级最高的三个模型。
期待学习的东西!
答案 0 :(得分:0)
如果你只需要一辆汽车,你应该随机化子查询(生产者一个),这样它只返回一个随机生产者,然后从那个生产者中选择一个随机产品:
如果有多个生产者具有最高优先级 - >一个人将被选中,每个人都有平等的机会 如果只有一个具有最高优先级的生产者 - >将选择一个
如果您需要更多汽车并且例如在主查询中执行ORDER BY RAND()LIMIT 2,则它不起作用...它将仅从一个生产者中选择所有汽车。在这种情况下,您需要多次重复上一个方法,每次都使用LIMIT 1
答案 1 :(得分:0)
这样可行,但它基本上要求您的查询条件要处理3次。对于那些符合条件的最高百分比的人来说,最重要的是。接下来,重新应用相同的标准,但只获得DISTINCT生产者。如果在您的样本中,您的生产商不是汽车,而是其产品的20%。你不希望列表中的那个生产者,因此它需要再次获得资格。通过在这里做到与众不同,你只有一次本田,福特一次。无论给定供应商提供多少产品,此查询都按rand()和Limit 1排序获得您希望的50%/ 50%。
最后,最外层只获取与所选提供商匹配的产品网址。现在,标准适用于汽车的第三个时间...让我们说你有“SUV”与“CAR”和“TRUCK”的额外数据,这两个生产商的所有合法产品。您只对与“CAR”产品相关联的网址感兴趣。
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'