2012-10-20 79 views
0

我有一個存儲團隊的MYSQL表。選擇表中的單行索引

表結構:
CREATE TABLE teams ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(28) COLLATE utf8_unicode_ci NOT NULL, UNIQUE KEY id (id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1;

的樣本數據:
INSERT INTOVALUES (1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), (5, 'five');

用途:
SELECT id, name, id as rowNumber FROM teams WHERE id = 4
返回正確的ROWNUMBER,因爲真的有三排在表格中面對它。但是這隻有在我不刪除一行時纔有效。

例子:
比方說,我DELETE FROM teams WHERE id = 3;
當我現在用SELECT id, name, id as rowNumber FROM teams WHERE id = 4,因爲現在只有兩個表中的行它(ID的1 & 2)盈的結果是錯誤的。

我怎樣才能從一個特定的行獲得由id排序的「真正的」行號/索引?

+0

你想訂購的ID查詢?你可以添加到查詢'ORDER BY id'。 –

回答

1

您正在使用ID作爲rowNumber,所以只需返回ID列值。你爲什麼期望它有所不同?

我想你可能需要定義和@curRow變量獲得的行號,並使用通過下面的子查詢:

SELECT * from 
    (SELECT ID, 
     NAME, 
     @curRow := @curRow + 1 AS rowNumber 
     FROM Teams t 
     JOIN (SELECT @curRow := 0) curr 
     ORDER by t.ID asc) as ordered_team 
WHERE ordered_team.id = 4; 
+0

我知道,這不是真正的行號。這隻適用於如果我不刪除團隊作爲自動增量照顧ID的情況,但我需要能夠刪除我的應用程序中的團隊。 – JNK

+0

你的'自動增量'在插入記錄時遞增ID列值。它不會向後移動,即當某些記錄被刪除時更新ID值。嘗試修改後的查詢。它應該可以幫助你實現你正在尋找的東西。 –

+0

@JNK我更新了查詢以幫助您實現單行選擇。請嘗試。這應該對你有所幫助。 –

0

爲什麼你麻煩的持久化層內排索引?

如果您確實需要依賴存儲的圖簇的「索引」,則可以引入一個變量並將其增加到每行的查詢/程序代碼中。

編輯: 剛剛發現一個:: With MySQL, how can I generate a column containing the record index in a table?

+0

但是,當我只選擇一行,因爲它總是會返回1,這不起作用。 – JNK

+0

我想我錯了......你想第一行返回#1編號,第二行#2 ?即使你刪除了一些行之間?爲什麼你需要這些索引ID? – Sven

+0

我想選擇其中id爲x的行,並獲取表/數組中的行「索引」(假設表是一個數組)。 – JNK

2

這不是一個好辦法,但與普通的SQL:

SELECT 
    t.id, 
    t.name, 
    (SELECT COUNT(*)+1 FROM teams WHERE id < t.id) as row_number 
FROM teams t 
WHERE t.id = 4