Mysql 来自最大集合的随机记录(带有附加约束)

Mysql 来自最大集合的随机记录(带有附加约束),mysql,Mysql,两张表,产品和生产商。我想买一种特定类型的产品,但只能从生产该产品的最高优先级的生产商那里购买,我需要他们的URL。如果多个制作人具有最高优先级,则给予每个制作人同等的被选中机会 例如,我决定买一辆汽车。从下面的示例数据中,本田和福特是优先级最高的汽车,所以在50%的时间内返回本田URL,在50%的时间内返回福特URL Products Table: | producer_id | product_type | product_url | |-------

两张表,产品和生产商。我想买一种特定类型的产品,但只能从生产该产品的最高优先级的生产商那里购买,我需要他们的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    |
我确信目前的混乱可以简化:

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'