2012-04-17 45 views
2

似乎有很多線程在這裏提出類似的問題,但我還沒有找到能夠幫助我解決問題的線程。MYSQL - 選擇具有最低值和其他條件的行,或具有最高的回退

我想選擇一排,在最低值,而其他三個條件必須是真還是回落到設定其他條件給定的變量(uc),然後選擇最高價。

Table: level (sample data) 
id |price |copies |used |uc 
-------------------------------------- 
1 |7  |10  |10  |charlie01 
2 |17  |10  |8  |charlie01 
3 |37  |5  |5  |charlie01 
4 |47  |10  |9  |charlie01 
7 |5  |15  |9  |charlie02 
8 |15  |15  |0  |charlie02 
9 |35  |15  |0  |charlie02 
10 |45  |15  |0  |charlie02 
11 |3  |5  |5  |charlie03 
12 |13  |5  |5  |charlie03 

結果: EDITED結果 - charlie01應該是2

VARIABLE |RESULTING ROW 
-------------------------- 
charlie01 |2 
charlie02 |7 
charlie03 |12 

### START僞代碼:###

最低price選擇行其中used小於copiesused大於0uc等於VARIABLE如果沒有結果(這意味着所有的used等於copies)與在used等於copiesuc等於VARIABLE

SELECT * 
FROM level 
WHERE 

    (
     used < copies 
     AND used > 0 
     AND uc = *VARIABLE* 
    ) 
### OR IF NO RESULTS ### 
    (
     used = copies 
     AND uc = *VARIABLE* 
    ) 

ORDER BY price ASC 
LIMIT 1 

最高價選擇行### END僞代碼###

這是我寫的查詢(使用uccharlie01作爲示例):

SELECT * 
FROM (
    SELECT * 
    FROM `level` 
    WHERE 
     ((
     `used` < `copies` 
     AND `used` > '0' 
     ) 
     OR 
     (
     `used` = `copies` 
     )) 
     AND `uc` = 'charlie01' 
     ORDER BY `price` ASC 

     ) AS T 
ORDER BY `used` ASC 
LIMIT 1 

它不能在因爲記錄3的樣本數據的工作,即使used = copies。這是因爲used on record 3 < used on record 2 (the row we want, because it has the lowest price)

我知道MAX()存在,並且已經嘗試了一個小時使用它,但沒有成功,我真的不認爲我的理解它是如何工作的,這似乎只是選擇整列的最大值不管是什麼...?

現在,我已經繞圈子添加了條件等,但我認爲我需要做一些類型的JOIN,但我不確定從哪裏開始。你如何看待我應該去查詢這個問題?

編輯:我真的很抱歉,我才意識到我是說,當我真正想選擇最低價格最高價,其中used < copies但最高價,如果所有used = copies

乾杯
查理

+0

但第4行*是*使用的最高價格<副本。你爲什麼改變結果表? – wlangstroth 2012-04-17 01:12:34

+0

Sh * t我很抱歉,我剛剛意識到我說的最高價格,當我真的試圖選擇最低的價格在哪裏使用<副本,玩這個很長的時間後的腦失效...... :( – 2012-04-17 01:19:21

+1

:)如果您更改結果表,我會更改代碼片段 – wlangstroth 2012-04-17 01:20:31

回答

1

如果你正在使用這個產品代碼,我會等待一個更好的答案,但有一些有趣的選項可能適合你...

SELECT * FROM (
    SELECT *, (used < copies and used > 0) AS copies_avail FROM level 
    ORDER BY copies_avail desc, IF(copies_avail, price, -price) ASC 
) AS x GROUP BY uc; 

這更有趣(儘量不說的hackish = P)類似的選項將是

(你可以,如果你想在where子句中指定一個UC只是用內段)
SELECT * FROM (
    SELECT * FROM level 
    ORDER BY IF(used < copies AND used > 0, price, -price + 10000) ASC 
) AS x GROUP BY uc; 

(其中10000比表中的任何預期的價格要高得多)

反正...相信這兩個輸出相匹配的編輯結果,但可能horribl表現明智。如果你確實遇到這樣的問題,你可能會將copies_avail查詢結果存儲在表中以避免使用filesort?

此外,對於used = 0和copies> 0的情況感到好奇 - 從描述中無法分辨出是否應該使用價格asc或price desc組進行排序。在這些例子中,它的價格是desc。

+0

謝謝你,這兩個querys工作正如我所需要的:)你能否詳細說明關於存儲copies_avail的部分?你的意思是存儲一個標誌(1 | 0)以避免排序所有內容?什麼是最好的實現方式? – 2012-04-29 05:31:18

+0

嘿查理,正在考慮在數據庫中存儲'(used 0)'邏輯可能會節省查詢中的一些複雜性,但實際上不確定,因爲我們也使用order by的價格。 – mikeb 2012-05-02 15:14:42