2012-08-11 103 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