2013-12-11 21 views
1

我必須選擇在每個類別最高紀錄,像MySQL的:選擇各組最好的,但不重複

ID| Category_Id | Item_Id | Price 
1 | 1   | 1  | 10 
2 | 1   | 1  | 7 
3 | 1   | 2  | 8 
4 | 1   | 2  | 5 
5 | 2   | 1  | 9 
6 | 2   | 1  | 6 
7 | 2   | 2  | 3 
8 | 2   | 2  | 8 
9 | 3   | 1  | 5 

SELECT * FROM (
    SELECT * FROM `products` ORDER BY price DESC 
) AS r GROUP BY category_id 

至於結果,我得到:

ID | CATEGORY_ID | ITEM_ID | PRICE 
1 | 1   | 1  | 10 
5 | 2   | 1  | 9 
9 | 3   | 1  | 5 

我不得不修改查詢僅返回唯一的ITEM_ID。例如,如果爲類別1選擇了項目1,則不能爲類別2選擇。因此,應爲其選擇下一個匹配項目。所以我應該得到:

ID | CATEGORY_ID | ITEM_ID | PRICE 
1 | 1   | 1  | 10 
8 | 2   | 2  | 8 
9 | 3   | 1  | 5 

類別#3只包含一個項目#1,它在之前用於類別#1。但複雜性是我們不能跳過任何類別。所以如果沒有ids離開,它必須開始使用已經使用的項目ID。

誰能幫忙?

UPD:好的,我發現它太複雜。可能是我可以簡化我的問題,那麼選擇非重複的項目ID,並不打擾跳過的類別?例如:

ID | CATEGORY_ID | ITEM_ID | PRICE 
1 | 1   | 1  | 10 
8 | 2   | 2  | 8 
9 | 3   | 1  | 5 
+0

下面是一個例子:http://sqlfiddle.com/#!2/1c7f7/1/0我不不瞭解如何查詢預期結果,所以我沒有任何東西可以作爲我嘗試的例子。預期的結果出現在上一個代碼塊中。 – WindBridges

+0

我認爲你應該擴大你的樣本數據,以涵蓋category_id 4必須使用item_id 3的情況,因爲item_id 1和2已經被category_id 1和2所佔用。噢,我認爲它不能輕易解決僅SQL。考慮應用層的解決方案。 – fancyPants

+0

較大的數據集和預期的結果樣本可能有助於此。我認爲item_id的規則是最不清楚的。也許可以解釋你正在努力完成什麼? –

回答

0

我不認爲你正在尋找的是(My)SQL。一個簡單的解決方案將是在多個查詢中完成。假設你想在網頁上有5張...

僞代碼:

SELECT * FROM yourTable WHERE Price = (SELECT MAX(Price) FROM yourTable); 
save category_id and item_id in an array; 
save everything else what you need for display anywhere; 
loop over the array 
    SELECT * FROM yourTable WHERE Price = (SELECT MAX(Price) FROM yourTable WHERE category_id NOT IN (/*insert used category_ids here*/) AND item_id NOT IN (/*insert used item_ids here*/)); 
    save category_id and item_id in an array; 
    save everything else what you need for display anywhere; 
end loop 
present whatever you need on your page