2012-03-19 177 views
0

我有如下表:这应该是什么正确的MySQL查询?

id name priority urgency output 
1 mark 0  0  A 
2 mark 0  1  B 
3 mark 0  0  C 
4 erik 0  0  D 
5 erik 0  0  E 

我想增加在列表中具有最高紧迫性的进入每个名称,或者最古老的之一,如果有相等紧迫问题清单的优先级。在此之后,我希望列表中每个名称具有最高优先级的条目。因此,在第一次运行后的表应该是这样的:

id name priority urgency output 
1 mark 0  0  A 
2 mark 1  1  B 
3 mark 0  0  C 
4 erik 1  0  D 
5 erik 0  0  E 

什么,然后我从数据库中想要的是与每个名称优先级最高的环节,所以这一点:

id name priority urgency output 
2 mark 1  1  B 
4 erik 1  0  D 

是否有某人在那里知道如何做到这一点?

回答

1

好吧,我会使用此查询数据库中选择所有独特的名字:

SELECT DISTINCT name FROM mytable ORDER BY name; 

从那里你可以得到的第一个迫切的,或者如果不适用,第一非迫切的:

SELECT 
    * 
FROM 
    mytable 
WHERE 
    name = '%' 
ORDER BY 
    urgency DESC, output ASC 
LIMIT 1 

然后用新的优先级更新该行:

UPDATE mytable SET priority = 1 WHERE id = % 

显然SELECT得到的优先项目是微不足道的。

+0

的这个缺点是,每个名字会把它弄的自己的查询。在我的例子中有两个名字,但是在实际的数据库中有3227个名字...... – patrick 2012-03-19 17:33:22

+0

在你的问题中没有提到这个约束。在实践中,这些查询的性能至关重要吗?你是通过网络请求还是离线进行此操作?如果你是用cron来做的话,那么它花费10秒(而不是一秒钟)就可以适用于你的用例。 – halfer 2012-03-19 17:43:34

+0

(顺便说一下,3227条记录并不多,试试看我的方式,看看它需要多长时间 - 即使对于服务器非常低的情况,这些查询也是微不足道的)。 – halfer 2012-03-19 17:46:47

2

更新查询:

Update user_priority u1, 
(
select min(id) as id 
from user_priority inner join 
(select name,max(urgency)as max_urg 
from user_priority 
group by name) as user_urgency on (user_priority.name = user_urgency.name 
and user_priority.urgency = user_urgency.max_urg) 
group by user_priority.name) u2 

set priority =priority +1 

where u1.id = u2.id 

获取最高优先级的记录每一个名字:

select * 
from user_priority 

where id in (
select min(id) 
from user_priority inner join 

(select name,max(urgency)as max_urg 
from user_priority 
group by name) as user_urgency on (user_priority.name = user_urgency.name 
and user_priority.urgency = user_urgency.max_urg) 
group by user_priority.name)