SQL“group by”使用优先级

时间:2011-07-04 11:40:46

标签: mysql sql

我有一个表格,我可以为这个给定的ID设置多个名称:

a_table(id int,name varchar(100),priority int);

我需要一个会在名称上搜索的语句,但要确保每个ID只返回1个名称,并且该名称将是具有更高优先级的名称。

e.g。如果我的数据是

1, AaaB, 2
1, AbbB, 1
1, AccB, 0
2, foo, 0
3, AddC, 0

我希望我的查询“A%”返回:

1, AaaB
3, AddC

我在想这样的事情:

select * from a_table where name like 'A%' group by id;

但这并不能保证会选择优先级较高的值。

有什么想法吗?

谢谢, 斯塔夫罗斯

5 个答案:

答案 0 :(得分:5)

答案 1 :(得分:1)

您必须首先获得每个ID的最高优先级,然后过滤名称:

select t2.id, t2.name, t2.price 
  from (
        select id, max(priority)
          from a_table
         group by id
       ) t1,
       a_table t2
 where t1.id = t2.id
   and t1.priority = t2.priority
   and t2.name like 'A%'

采用@ niktrs的有效建议,这与上面的查询相同,使用标准JOIN代替where来连接表。这比前一个更优先

select t2.id, t2.name, t2.price 
  from (
        select id, max(priority)
          from a_table
         group by id
       ) t1 JOIN a_table t2 ON t1.id = t2.id
   and t1.priority = t2.priority
   and t2.name like 'A%'

答案 2 :(得分:0)

select *
from a_table t
join (
    select max(Priority) MaxPriority, Name
    from a_table a
    where name like 'A%'
    group by Name
)x where x.MaxPriority=a.Priority and x.Name=t.Name

基于数据示例中的第一列是“优先级”。

这只是从Alvaro的答案中链接的SQL。

答案 3 :(得分:0)

select id, name 
from a_table at
where 
    name like 'A%' and
    priority = (
        select max(priority)
        from a_table
        where (id = at.id) and (name like 'A%')            
    )

答案 4 :(得分:0)

这会有效吗,

选择不同的id,first_value(name)over(按名称分区的id分区) 来自demo_tab t 其中t.name喜欢'A%'

抱歉pratik, 一定是

选择不同的id,first_value(name)over(按优先级desc的id顺序分区) 来自demo_tab,其名称类似于'A%'