2012-08-11 105 views
0

這是我之前的問題here的延續。根據列值優先選擇唯一記錄

在下面的例子:

id  PRODUCT ID COLOUR 
1  1001   GREEN 
2  1002   GREEN 
3  1002   RED 
4  1003   RED 

給定的產品ID,我只想檢索一個紀錄 - 與綠色,如果存在的話,或紅色的除外。這聽起來像我需要以某種方式使用DISTINCT,但我不知道如何提供優先級規則。

非常基本的我敢肯定,但我的SQL技能比生鏽更多..

編輯:謝謝大家。還有一個問題:如何做到這一點,以處理多個記錄,即。如果WHERE子句返回的不僅僅是一條記錄?限制1將限制整個集合,而我想要的僅限於每個產品中。例如,如果我有像SELECT * FROM table那樣的產品id like「1%」...我如何檢索每個獨特的產品,但仍然尊重顏色優先級(綠色>紅色)?

回答

1
SELECT * 
FROM yourtable 
WHERE ProductID = (your id) 
ORDER BY colour 
LIMIT 1 

(格林將來到紅之前,您所看到的LIMIT子句只返回一個記錄。)

爲了您的後續編輯,你可以做到這一點

select yourtable.* 
from 
    yourtable 
    inner join 
    (select productid, min(colour) mincolour 
    from yourtable 
    where productid like '10%' 
    group by productid) v 
    on yourtable.productid=v.productid 
    and yourtable.colour=v.mincolour  
+0

謝謝,你能看看編輯以及? – lucianf 2012-08-11 15:57:24

+0

請參閱上面的修改。其他SQL有行編號功能,這使得這更容易,但SQLite缺乏。 – podiluska 2012-08-12 12:40:39

+0

再次感謝,我從來沒有想到它會是這個複雜! – lucianf 2012-08-13 07:23:01

2

試試這個:

SELECT top 1 * 
FROM <table> 
WHERE ProductID = <id> 
ORDER BY case when colour ='GREEN' then 1 
       when colour ='RED' then 2 end 

如果您想基於另一種顏色訂購它,您可以在案例聲明

+0

謝謝,這種情況使得它比其他答案更通用,但是前1在sqlite中不起作用。 – lucianf 2012-08-11 15:06:40