最大集合的随机记录(附加约束)

时间:2011-11-16 13:41:26

标签: mysql

两个表,产品和生产者。我想买一种特定类型的产品,但只能从制造它的最高优先级的生产商那里购买,我需要他们的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的时间,因为本田有三个优先级最高的三个模型。

期待学习的东西!

2 个答案:

答案 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'
相关问题