2012-03-19 88 views
2

好吧,我想了解如何確定我從下表中設置的相機的頂級選項。這不是一個真實的場景,我只是試圖找出最好的方法或一些方法來做到這一點。因此,相機表具有唯一,名稱(VARCHAR),reviewRank(INT),價格(INT)和failRate(INT)的條目id(INT)。下面是表設置和插入代碼的示例:MySQL查詢根據多列值選擇頂級相機選擇

CREATE TABLE CAMERA(
id INTEGER, 
name VARCHAR(30), 
reviewRank INT, 
price INT, 
failRate INT, 
PRIMARY KEY(id))ENGINE=INNODB; 

INSERT INTO CAMERA VALUES(1,'Camera 1',5,100,1); 
INSERT INTO CAMERA VALUES(2,'Camera 2',4,300,7); 
INSERT INTO CAMERA VALUES(3,'Camera 3',1,10,99); 
INSERT INTO CAMERA VALUES(4,'Camera 4',1,10,6); 

標準是較高reviewRank較好,以較低的價格比較好,和下failRate更好。如果多臺攝像機分享其中一列的最佳值,那麼我們會選擇其他兩列中具有最佳值的那臺攝像機,或者如果多臺攝像機在多列中具有相同的值,例如CAMERA(3,'Camera 3',1 ,10,99)和CAMERA(4,'Camera 4',1,10,6),然後最後一列確定結果。

基本上,任何三列中任何一個具有最佳值的相機都會自動成爲可供選擇的頂級相機列表的候選人。但是,如果多個攝像機對同一列具有最佳值,那麼我們需要通過查看其他列的值來確定哪些是最好的。

因此,使用上面的數據庫狀態查詢將返回相機(1,'相機1',5,100,1)和(4,'相機4',1,10,6),因爲相機ID 1具有最高的評論等級和最低failRate和相機ID 4和相機ID 3領帶爲最低的價格,但相機ID 4有一個較低的失敗率比相機ID 3.

所以基本上我試圖找到一種方式去尋找最佳選擇哪裏有多個使用MySQL的列比較,如果可能的話最好使用單個查詢。

我最初的想法是這樣的事情

SELECT DISTINCT C.* 
FROM CAMERA C 
WHERE C.reviewRank>=ALL(SELECT reviewRank FROM CAMERA) 
OR C.price<=ALL(SELECT price FROM CAMERA) 
OR C.failRate<=ALL(SELECT failRate FROM CAMERA); 

然而,這顯然是錯誤的,因爲它沒有覆蓋所有可能的排列。 經過相當多的尋找一種方式去做這件事後,我仍然不知道如何去做這件事。

回答

0

我相信ORDER BY條款完成你要找的東西:

SELECT topC.Id, topC.Name, topC.ReviewRank, topC.Price, topC.FailRate 
FROM Camera topC JOIN (
    (SELECT c.ReviewRank, c.Price, c.FailRate 
    FROM Camera c 
    ORDER BY 
     c.ReviewRank DESC, 
     c.Price, 
     c.FailRate 
    LIMIT 1) 
    UNION 
    (SELECT c.ReviewRank, c.Price, c.FailRate 
    FROM Camera c 
    ORDER BY 
     c.Price, 
     c.FailRate, 
     c.ReviewRank DESC 
    LIMIT 1) 
    UNION 
    (SELECT c.ReviewRank, c.Price, c.FailRate 
    FROM Camera c 
    ORDER BY 
     c.FailRate, 
     c.Price, 
     c.ReviewRank DESC 
    LIMIT 1) 
) values 
    ON values.ReviewRank = topC.ReviewRank 
    AND values.Price = topC.price 
    AND values.FailRate = topC.FailRate 
+0

這兩個攝像頭(1, '攝像機1',5,100,1)和(4 '攝像機4',1,10 ,6)需要返回,因爲(1,'Camera 1',5,100,1)具有最好的總體評價等級,並且具有最好的failRate,所以它應該被視爲首選。相機(4,'相機4',1,10,6)與相機共享最佳價格(3,'相機3',1,10,99),但具有更好的失敗率,因此相機(4,'相機4', 1,10,6)也應該退回 – BobPotter 2012-03-19 22:41:02

+0

@BobPotter啊,我現在明白了......所以你需要從你的三個類別中的每一個單個項目,但如果同一個項目是多個類別的最佳選擇,那麼它應該只返回一次。請參閱我更新的查詢。 – 2012-03-19 23:04:22

+0

您發佈的代碼片段確實似乎可以在給定狀態下正常工作。 我想你正確地理解了這個問題。 爲了澄清,結果不一定是來自三個類別中的每一個的單個項目。如果該元組具有最佳排名,最佳價格和最佳failRate,則該查詢可能只返回一個元組。所以是的,基本上你說的我認爲。 – BobPotter 2012-03-19 23:25:33