2011-11-16 53 views
1

兩張桌子,產品和生產者。我想購買特定類型的產品,但只能從生產該產品的最高優先級的生產商購買,並且我需要他們的網址。如果多個生產者具有最高的優先級,那麼給每個生產者和被選中的機會相等。最大集隨機記錄(附加約束)

我決定買一輛車。從下面的示例數據中,本田和福特是優先級最高的車型,因此返回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 /三分之二,因爲本田有兩個三個最高優先級的模型。

期待學習的東西!

回答

0

如果你只需要一個車,你應該隨機子查詢(生產者之一),因此它返回的只是一個隨機監製,然後選擇從生產者隨機產品:

如果有幾個生產者具有最高優先級 - >將爲每個人選擇一個具有相同機會的選項 如果只有一個生產者具有最高優先級 - >將選擇一個

如果您需要更多汽車並且例如訂購BY RAND()在主查詢中限制2 ...它將僅從一個生產者中選擇所有的汽車。在這種情況下,您需要多次重複以前的方法,每次都有限制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'