2012-03-18 97 views
0

我真的很苦惱,現在已經很久了,並且已經在這裏問了兩個問題!生氣 - 我需要根據條件對結果進行分組

因此,這裏有一個希望更明確的問題。

我有一個包含幾千種產品的產品數據庫。

產品可以按item分組,以便不會在我的搜索結果中顯示基本相同但結尾不同的多個項目。

所以,一個簡單的select查詢看起來像:

SELECT * FROM products GROUP BY item 

這會給我所有的產品只顯示了每個項目(該想法是,觀察客戶點擊別的東西來顯示所有的完成選項)

我可以使用類似

SELECT *, GROUP_CONCAT(finishes) FROM products GROUP BY item 

但讓我完成選項...這裏就是我有問題

在我的搜索結果頁面中,分組的「隨機」順序對我來說並不好。我需要能夠有從小組條款取決於以下condtions

- If there is no stock of any finish, then display the cheapest option 
- If there is stock, then display the cheapest item which is in stock 

獲取只是一個ID是不行的,我需要完整的記錄顯示的項目,所以在某種程度上我需要的是一個條件語句確定分組記錄的呈現順序,以確保我從recordset獲得的項目符合上述標準。

我根本無法解決如何做到這一點,我嘗試了數百萬個不同的INNER JOIN和'CASE場景,但卻無法讓它工作。

這裏就是我得今天上午:

​​

這是給我的結果,而是形成原因,一些項目被排除在結果和排序順序仍然是不正確的。

要回答以下@DRapp,這裏的一些基本的樣本數據

item  | price  |  finish   | totalStock 

item 1 |  £1  |  red   |  2 
item 1 |  £1  |  blue   |  1 
item 1 |  £1.50 |  blue & red |  1 

item 2 |  £2  |  red   |  0 
item 2 |  £3  |  blue   |  1 

item 3 |  £3.50 |  blue & red |  1 
item 3 |  £1  |  red   |  0 
item 3 |  £2  |  blue   |  1 

item 4 |  £4.50 |  blue & red |  1 

item 5 |  £1.50 |  blue   |  0 
item 5 |  £2.50 |  green  |  0 
item 5 |  £0.50 |  orange  |  0 

我想看到的結果是:

  • 項目1,紅(sumTotalStock = 4) - 「紅色和藍色的股票都最廉價的&。示任一結果是好的,但爲100%的完美,顯示出紅色作爲庫存是最大
  • 項目2,藍色(sumTotalStock = 1) - 」藍色是唯一的完成的庫存
  • 項目3,藍(sumTotalStock = 2) - 「顯示藍色,因爲它是最便宜的股票
  • 項目4,藍色&紅(sumTotalStock = 1)-'there沒有完成的選項,所以只顯示這一塊,無論股票/價格
  • item 5,orange(sumTotalStock = 0) - 'none i n股票,但顯示橙色,因爲它是最便宜的。

顯然有更多的數據,以實際顯示比剛跑完,價格,產品說明等也,這可能取決於完成,因此我也需要得到完整的記錄,但是這個數據的例子應該解釋原則。

+0

在Oracle中,我會寫一個USER DEFINED AGGREGATE FUNCTION - 不確定是否有關於mysql。也許寫一個函數,將該項目作爲參數,然後返回一個完成的字符串。 – Randy 2012-03-18 13:51:45

+0

很確定這是一個最大的每組問題的例子。搜索帶標籤的問題以查看可能有所幫助的一些解決方案:http:// stackoverflow。com/questions/tagged/most-n-group- – 2012-03-18 13:53:12

+0

您可以轉儲一些示例數據,包括沒有完成的示例數據以及定價樣本等。然後展示你想要什麼樣的最終結果(如果Martijn的回答不是你的最終結果) – DRapp 2012-03-18 14:41:34

回答

0

這應該做你想要使用一個「簡單」左連接和沒有嵌套的選擇;您的排序標準使查詢看起來有點龐大:)

SELECT p1.* 
FROM Products p1 
LEFT JOIN Products p2 
    ON p1.item=p2.item AND 
    (IF(p1.totalstock,1,0) < IF(p2.totalstock,1,0) OR 
     (IF(p1.totalstock,1,0) = IF(p2.totalstock,1,0) AND 
     p1.price > p2.price) OR 
     (p1.price = p2.price AND 
     p1.totalstock < p2.totalstock) OR 
     (p1.price = p2.price AND 
     p1.totalstock = p2.totalstock AND 
     p1.id > p2.id)) 
WHERE p2.id IS NULL 

演示here

+0

那個廁所ks與我試圖實現的類似,你能解釋一下'WHERE p2.id IS NULL'嗎?另外,這是在哪裏把我的主要搜索條件'WHERE'子句? – 2012-03-18 16:11:13

+0

@JamieHartnoll基本上它使用'LEFT JOIN'進行排序,試圖將每個p1與「更好」的p2進行匹配。如果沒有更好的p2,那麼p2.id是NULL。你是否有典型的WHERE條件? – 2012-03-18 16:21:26

+0

優秀,這似乎是工作!對於查詢某個項目,我正在執行'WHERE p1.item ='SEARCH TEXT''這似乎可行,我需要的最常見的其他應用程序是查詢類別字段,品牌以及您提到的價格(我排除了原始問題的類別,因爲它不是問題的一部分),所以對於這些我需要根據您的評論放入「p1」和「p2」? – 2012-03-18 16:26:51

0

以下內容將以最低的價格爲您提供每件商品。您可以再次加入此項目,以獲取剩餘細節,加入項目和最低價格。如果價格相同,您需要選擇一些類型的領帶夾。這對你來說足夠了嗎?

SELECT COALESCE(instock.price, allItems.price) as lowest_price, item FROM 
(SELECT MIN(price) as minprice, item FROM products WHERE totalstock > 0 GROUP BY item) as instock 
RIGHT OUTER JOIN 
(SELECT MIN(price) as minprice, item FROM products GROUP BY item) as allItems 
ON instock.item = allItems.item 

編輯:MySQL沒有完整的外連接。更改爲正確的外部聯接,並從缺貨中刪除該條件,以使其包含所有項目。

+0

謝謝,我現在試試。直到今天早上我都沒有使用'join',我很模糊。我會盡力的! – 2012-03-18 14:41:32

+0

嗯,我得到一個SQL語法錯誤在您的代碼中,試圖將其添加到我的''select'如下:'SELECT * FROM products prod INNER JOIN(SELECT COALESCE(instock.price,outstock.price)as lowest_price,項目FROM(SELECT MIN(price)as minprice,item FROM WHERE totalstock> 0 GROUP BY item)as instock FULL OUTER JOIN(SELECT MIN(price)as minprice,item FROM products WHERE totalstock <= 0 GROUP BY item)as outstock ON instock.item = outstock.item)sortedProd ON sortedProd.item'我在'FULL OUTER JOIN'附近獲得'語法錯誤'(' – 2012-03-18 14:52:37

+0

呃,mysql,我忘記了,沒有完整的外連接,我將修復查詢因爲它 – Martijn 2012-03-18 16:21:10

相關問題