2011-04-19 72 views
1

的ID我有以下的數據庫的MySQL獲得最低的ID爲某個用戶 - 或者具有最高緊迫性的進入每一行

id | user | urgency | problem   | solved 

在那裏有不同的用戶的信息,但這些用戶全部有多個條目

1 | marco | 0  | MySQL problem | n 
2 | marco | 0  | Email problem | n 
3 | eddy | 0  | Email problem | n 
4 | eddy | 1  | MTV doesn't work | n 
5 | frank | 0  | out of coffee | y 

我想要做的是這樣的:通常我會先檢查每個人最古老的問題。我使用此查詢來獲取最舊問題的ID。從DB組

選擇分鐘(ID)由用戶

這給了我最古老的問題ID的列表。但我希望人們能夠使某個問題更加緊迫。我想爲每個用戶提供最迫切的ID或最緊急的問題ID

獲取最大(緊急)時不會給出問題的ID,它會給我最大的緊迫感。我一整晚都在這裏,但似乎無法擺脫困境。任何人都可以幫助我呢?

要明確:我想這個結果

row | id 
0 | 1 
1 | 4 

中的最後一項應該是結果,因爲它解決了

回答

0

下面將讓你的具體哪一行去 - 在最緊急的,可能是您桌子上最老的問題。

select id from my_table where id = (
    select min(id) from my_table where urgency = (
     select max(urgency) from my_table 
    ) 
) 

我正要建議增加一個CREATE_DATE列到你的表,以便你能先取得的最古老的問題對於同一緊急級別的那些問題。但是我現在假設你正在爲此使用最低的ID。

但現在我看到你想要他們的名單。

我忘了,說實話,如何讓行號對於這一點,你的結果通過ID進行排序:

select id from my_table where urgency = (
    select max(urgency) from my_table 
) order by id; 

[由左的順序編輯!]。在interwebs有人建議這樣的事情,但不知道,如果它的工作原理:

select @rownum:[email protected]+1 ‘row', id from my_table where ... 
+0

這不是我想要的。這給了一個結果,我需要一個每個人的ID列表,基本上是一個按用戶分組的列表,最老的問題(實際上是通過ID進行檢查)的ID或最緊急的。ID很好,我不需要行號 – patrick 2011-04-19 02:29:03

+0

也許這有助於:每個用戶都可以通過此查詢查看他們自己的列表:select * from problem where user ='eddy'order by urgency desc,id asc that will show用戶自己的列表。我正在尋找每個這些列表中的頂部條目。分組和排序不起作用,因爲這會對分組結果進行排序。 – patrick 2011-04-19 02:32:26

+0

請重新閱讀整篇文章。我正在編輯好一點。看起來你在完成之前閱讀它。 – Marvo 2011-04-19 02:35:07

0

有許多深奧的方式來做到這一點,但這裏有更清晰的一個。

首先生成一個查詢去得到你的最小的ID和最大的緊迫性:

SELECT 
    user, 
    MIN(id) AS min_id, 
    MAX(urgency) AS max_urgency 
FROM 
    db 
GROUP BY 
    user 

然後合併,作爲一個邏輯表到 一個大的查詢您的回答:

SELECT 
    user, 
    min_id, 
    max_urgency, 
    ( SELECT MIN(id) FROM db 
     WHERE user = a.user 
      AND urgency = a.max_urgency 
    ) AS max_urgency_min_id 
FROM 
(
    SELECT 
     user, 
     MIN(id) AS min_id, 
     MAX(urgency) AS max_urgency 
    FROM 
     db 
    GROUP BY 
     user 
) AS a 

鑑於明顯索引,這應該是非常有效的。

1
Select ... 
From SomeTable As T 
    Join (
      Select T1.User, Min(T1.Id) As Id 
      From SomeTable As T1 
       Join (
         Select T2.User, Max(T2.Urgency) As Urgency 
         From SomeTable As T2 
         Where T2.Solved = 'n' 
         Group By T2.User 
         ) As MaxUrgency 
        On MaxUrgency.User = T1.User 
         And MaxUrgency.Urgency = T1.Urgency 
      Where T1.Solved = 'n' 
      Group By T1.User 
      ) As Z 
     On Z.User = T.User 
       And Z.Id = T.Id 
+0

似乎越來越接近我要找的地方!忘記數據庫中的一個條目,我只想回到未解決的問題。在這個查詢中,我不知道在哪裏解決='n'「。 – patrick 2011-04-20 09:54:22

+0

@patrick - 我想你會在最內層的兩個層面上需要這個過濾器。你需要在最內層的加入,否則你可能會得到解決的問題是最緊急的。您在下一個最內部的連接中需要它,因爲您可以解決給定用戶的最低ID。然而,自從我們加入Id後,在最外面的桌子上,它不應該被需要。 – Thomas 2011-04-20 13:54:39

+0

緊迫性對每個用戶都是獨一無二的。用戶只能優先考慮將緊急事件設置爲高於該用戶最高緊急程度的問題。當問題得到解決時,迫切性被設置爲0.因此,對於同一用戶而言,沒有兩個問題對於同樣的緊急程度是沒有風險的...... – patrick 2011-04-23 09:53:07

相關問題