2012-03-09 45 views
1

我有一個表稱爲 「參與者」,擁有3個領域:
prt_id
prt_event_id
prt_participant_idPHP MySQL的 - 查找行ID

我有什麼是對的event_id一個WHERE條件選擇查詢。查詢返回讓我們說20行(20個不同的參與者)。我想要做的是能夠找出給定參與者的行號(prt_id)。

SELECT * 
FROM participants 
WHERE prt_id = someinteger 
+0

RowID是Oracle的一項功能:http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm – Churk 2012-03-09 13:40:07

+0

您需要什麼?您知道,行的順序不是您添加記錄的順序。 – 2012-03-09 13:40:36

+0

當然......但我想保持簡單的帖子。事實上,我根據時間戳命令我的選擇查詢... – Marc 2012-03-09 13:45:23

回答

3

之一,而你不能找到明確使用MySQL行ID,你可以這樣做以下:

$conn = new mysqli(/*dbinfo*/); 
$res = $conn->query("SELECT prt_id FROM participants"); 

$rowids = array(); $currid = 1; 
while ($row = $res->fetch_object()) { // this is using the mysqli library 
    $rowids[$row->prt_id] = $currid; 
    $currid++; 
} 

這會給你一個數組的與prt_id相關聯的ID。

+0

Hello Baez。我正在尋找另一種解決方案,而不是一個while循環,但是我發現沒有像rowId或類似的東西。那麼...... – Marc 2012-03-09 13:51:23

+0

正如我已經指出的那樣,如果你插入一行,會發生什麼,下一次你得到這個,你的號碼將不符合以前。 – Churk 2012-03-09 13:51:43

+0

@Churk只要你沒有指定'ORDER BY prt_id'子句或刪除一個值,那麼這個ID就應該始終保持不變。 – 2012-03-09 13:55:54

0

您可以在數據庫中添加一個索引列,將其設置爲int,主鍵和自動增量。然後在檢索行時檢索索引號。

+0

這與使用一個主鍵列相同的想法,只是因爲你分配自動增量,如果你刪除一行並插入另一個,你不會重複使用刪除了行的ID。 – Churk 2012-03-09 13:44:20

0

你可以這樣做:

<?php 

$counter = 1; // Start at one for first entry 

$res = mysql_query("SELECT * FROM participants WHERE prt_id = 12"); 

while($array = mysql_fetch_assoc($res)) 
{ 
    // Do something with the counter, store it into array with details 
    $counter++; 
} 
?> 
1

這應該做你想做的MySQL中(即分配在prt_id的順序ROWNUM),但性能將取決於中行的數量表,所以它不是最佳的。

SELECT * FROM (
    SELECT @tmp:[email protected]+1 rownum, p.* 
    FROM (SELECT @tmp:=0) z, participants p 
    ORDER BY prt_id 
) participants 
WHERE prt_id = 36; 

演示here

編輯:這「DOH電平」重寫使用一個簡單的索引範圍,而不是表掃描的,所以要快很多(提供prt_id是主鍵)

SELECT *, COUNT(p2.prt_id) ROWNUM 
FROM participants p1 
JOIN participants p2 
    ON p1.prt_id >= p2.prt_id 
WHERE p1.prt_id=36; 

演示here

+0

很好的答案,但正如你所說,即使是最少量的行,這也會非常緩慢。 +1 – 2012-03-09 13:53:56