选择一行具有值的优先级

时间:2015-07-28 12:43:59

标签: mysql sql

ELLO!

我试图用“' w'”' e'选择一行。或者' s'和一个独特的GUID。 ' E'具有最高优先级,因此当GUID包含应该选择该行时。 ' W'第二高的优先级,所以当没有其他的优先权时。 ' W'应该被选中。连同整个行数据。

我尝试使用以下代码:

SELECT * FROM TABLENAME 
WHERE GUID IN (SELECT DISTINCT GUID FROM TABLENAME ) 
AND (CATEGORY='S' OR CATEGORY='E' OR CATEGORY='W') 

无论如何,我怎么能做我所描述的事情?我一直在尝试使用不同的方法来使用不同的方法,但它仍然为每个GUID提供了不止一行。

分组byn还没有工作。因为我在添加它时收到错误。

编辑:添加图片 http://i.stack.imgur.com/3zgeF.png

2 个答案:

答案 0 :(得分:4)

select guid, min(priority) from
(SELECT *, 
 case when category = 'E' then 1
      when category = 'W' then 2
      when category = 'S' then 3 
 end as priority 
FROM TABLENAME 
WHERE CATEGORY in ('S','E','W') ) a

内部查询根据问题为category列分配优先级。在外部查询中,您可以从具有最高优先级的任何类别中进行选择。还要在外部select中包含您需要的所有其他列。

修改:上述方法并不健全,因为您无法使用计算出的priority列来选择每个guid对应的类别。  因此,另一种方法是使用union

SELECT * FROM TABLENAME 
WHERE CATEGORY = 'E'
union
SELECT * FROM TABLENAME 
WHERE CATEGORY = 'W' 
and guid not in (select guid from tablename where category ='E')
union
SELECT * FROM TABLENAME 
WHERE CATEGORY = 'S'
and guid not in(select guid from tablename where category in ('E','W'))

第一个查询选择类别为E的所有行。第二个查询选择其类别为W并且之前未选择其guid的所有行。第三个查询选择所有类别为S并且在前两个查询中未选择其guid的行。 UNION所有查询都应该为您提供所需的结果。 尝试使用虚拟数据的SQL小提琴。 http://sqlfiddle.com/#!9/07c0d/1

答案 1 :(得分:0)

一种方法是为每个guid获取适当的类别,然后再返回join。另一个是union all系列。后者可能更有效率,因为您没有很多选项来确定优先级:

select t.*
from tablename t
where category = 'e'
union all
select t.*
from tablename t
where category = 'w' and
      not exists (select 1 from tablename t2
                  where t2.category in ('e') and t2.guid  = t.guid
                 ) 
union all
select t.*
from tablename t
where category = 's' and
      not exists (select 1 from tablename t2
                  where t2.category in ('e', 'w') and t2.guid  = t.guid
                 ) ;

为了提高性能,您需要categoryguid, category上的索引。