2012-03-05 40 views
0

我想返回特定行的行號(所以給定行之前有多少行)。Mysql COUNT(*)在foreach循環中獲取行號。性能問題?

現在問題是PRIMARY_KEYs不是順序的,所以裏面有'空白',因爲有時我必須刪除行。

id = 1 
id = 2 
id = 5 
id = 9 
id = 10 

因此要得到行號的唯一選擇是使用COUNT(*):

SELECT COUNT(*) FROM table WHERE id < selected_row_id; 

但是對於一個給定的網頁我有多次執行此操作..所以一個解決方案是使用foreach循環,如:

foreach($foo as $item){ 
    mysql_query("SELECT COUNT(*) FROM table WHERE id < $item['id']"); 
    //... 
} 

但我認爲這不是最佳的......如果有數千行和80-100迭代上面的foreach。

另一種解決方案是在DELETING一行之後重建整個id列..但是因爲外部約束/引用我認爲這不是一個好的步驟。

因此,如果foreach中的COUNT(*)不可行,那麼是否有人遇到這種類型的問題,那麼最佳解決方案是什麼?

感謝您的時間,併爲我的英語不好。

+0

您能否提供有關您將使用生成的COUNT數據的位置的詳細信息?也許還有另一種解決方法。 – philwilks 2012-03-05 11:15:43

+0

看看這個其他的問題:[Mysql rank function](http://stackoverflow.com/questions/3333665/mysql-rank-function)。我認爲這是你需要的 – 2012-03-05 11:17:36

+0

爲什麼你需要它在循環?我知道的唯一實際問題是如何得到一個。什麼是這個ID的數組?順便說一下,陣列的大小是多少? – 2012-03-05 11:23:37

回答

0

而不是在每次刪除或插入後重建id列,而只是在表中添加一個新列以存儲所需的數據?

+0

在關係模型中,行的數量應該是相對無用的,因爲行的順序應該是沒有意義的。但是如果行號是真實數據,這是處理它的方法。 – 2012-03-05 11:23:21

0

我最近有一個類似的問題,對於給定的一組結果,我想知道該集合中特定結果的位置#。

有一個優雅的解決方案,它會給你一個結果順序排數字,基於可變

內部遞增見http://craftycodeblog.com/2010/09/13/rownum-simulation-with-mysql

希望幫助你出來

+0

這是不同的問題 – 2012-03-05 11:25:53

+0

從某種意義上說它是一個不同的問題?兩者都試圖在一組結果 – solarise 2012-03-05 11:29:46

+0

中找到特定行的具體編號,沒有一組結果。 – 2012-03-05 11:32:33

-1

有幾種方法以改善此問題

  • 您可以按ID排序$items,然後跟蹤行數在最後一個項目的上方,並添加到當前項目和最後一個項目之間的行數:$last_id <= id AND id < $item['id']
  • 上下文切換很昂貴。最好在單個查詢中獲取所有ID,然後使用PHP處理信息。
+0

上下文切換?你在談論上下文切換? – 2012-03-05 11:26:57

+0

...? (15個字符) – 2012-03-05 11:29:20

+0

你不覺得它不是CPU環境切換會成爲瓶頸嗎? – 2012-03-05 11:31:24

0

我想你想試試這個:

SELECT parent.Id, count(DISTINCT (child.Id)) AS previous 
FROM table AS parent, table AS child 
WHERE child.Id < parent.Id 

我不認爲這是從數據庫的角度有效的,但應該比從代碼中將更好。警告的是,你需要建立所需的PHP代碼,因爲我不熟練,但應該很容易。

+0

你甚至可以嘗試沒有'獨特'。 – 2012-03-05 17:04:14