2012-02-01 13 views
1

我的工作的MySQL獲得行到一個給定列屬性

jobid priority (abbreviated here) 

新任務來到這個表的表,他們得到基於優先級和高優先級的作業重新排序,會首先執行。我想知道我的工作ID有多少工作在我之前。我該如何爲此寫一個查詢。我正在使用PHP,我甚至可以在事後處理,但問題是如何獲得按優先級排序的所有行到我的jobid?

樣本數據

jobid priority (assume small number is high priority here) 
-------------- 
6  1 
4  1 
21  1 
14  1 
16  2 
7  2 

我想所有的JobID 16之前我如何做到這一點的工作。

一些東西一樣

select * from jobs order by priority asc,start_time and stop when id touches 16 
+0

對於具有重複優先級的兩個工作ID,他們是如何訂購的? – 2012-02-01 22:36:58

+0

@MarcusAdams,根據他的例子,它看起來像是用'start_time'打斷了關係。 (至少,這是我在我的答案中所做的假設) – 2012-02-01 22:46:36

回答

1
SELECT * FROM tbl WHERE priority < (SELECT priority FROM tbl WHERE jobid = 16) 
+0

該示例僅在我想知道有多少個作業或優先級x之前有效。但那不是我想要的。怎麼樣,如果我想找到多少工作jobid 14 – kiran 2012-02-01 22:41:11

+0

'= 16'當然只是一個佔位符,如果你需要jobid = 14只是改變oO – dynamic 2012-02-01 22:44:03

+0

@kiran,是不是很明顯,他的16只是一個例子,就像你的16是在你的問題? – 2012-02-01 22:47:56

1

你被prioritystart_time排序,所以你需要找出特定記錄的優先級和START_TIME是第一的。

SELECT priority, start_time FROM jobs 
WHERE jobid = 16 
LIMIT 1 

保存這些結果。你會在實際選擇你想要的行查詢使用它們:

SELECT * FROM jobs 
WHERE priority < {PRIORITY_16} 
    OR (priority = {PRIORITY_16} AND start_time < {START_TIME_16}) 
ORDER BY priority, start_time 

在上面的查詢,你第一個查詢檢索的值替換{PRIORITY_16}{START_TIME_16}

而不是使用上述兩個查詢,您可以使用一個查詢與三個子查詢,但這將導致四個實際查詢。這是你會怎麼做:

SELECT * 
FROM jobs 
WHERE priority < (SELECT priority FROM tbl WHERE jobid = 16) 
    OR (priority = (SELECT priority FROM tbl WHERE jobid = 16) 
    AND start_time < (SELECT start_time FROM tbl WHERE jobid = 16)) 
ORDER BY priority, start_time 
+0

這不行的本。表格中較高的作業的開始時間可能會大於較低的作業的開始時間。這些工作並不是永久性的。他們可以優先更改,然後工作更高或更低。因此,對於我的查詢,我知道的唯一事情就是我的工作ID。我希望按照優先順序排列時,我所有的工作都是什麼。優先級並不是唯一的工作。系統中可以有10000個工作,只有4個優先級1,2,3,4。 – kiran 2012-02-01 23:15:29

+0

@kiran,檢查一下它在做什麼,你的異議是不正確的。這將返回*優先級更高的所有*,而不管它是否是start_time。它還將返回具有較新開始時間的*等同*優先級的所有內容。這個組合*精確地*是您正在尋找的那一行之上的所有行的集合。 – 2012-02-01 23:32:57

1

如果你想連接(有時優化更好)在子查詢:

SELECT jobs.* 
FROM jobs 
JOIN jobs j2 
ON j2.jobid = 16 
AND ((jobs.priority < j2.priority) OR 
    (jobs.priority = j2.priority AND jobs.start_time < j2.start_time)) 
ORDER BY jobs.priority, jobs.start_time 

與任何作業ID你試圖返回替換16結果。

+0

馬庫斯,以前的工作的開始時間可以比較低的工作更高。因爲優先級增加,所以你的解決方案在這裏不起作用 – kiran 2012-02-01 23:20:46

+0

+1,我認爲這是最好的解決方案(是的,包括與我的相比) – 2012-02-01 23:46:34

+0

@kiran,抱歉,我忘記了訂單條款。我更新了查詢。它應該沒有正確的順序。 – 2012-02-02 13:37:24

相關問題