2012-03-19 173 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)