我有一個表稱爲 「參與者」,擁有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
我有一個表稱爲 「參與者」,擁有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
之一,而你不能找到明確使用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。
您可以在數據庫中添加一個索引列,將其設置爲int,主鍵和自動增量。然後在檢索行時檢索索引號。
這與使用一個主鍵列相同的想法,只是因爲你分配自動增量,如果你刪除一行並插入另一個,你不會重複使用刪除了行的ID。 – Churk 2012-03-09 13:44:20
RowID是Oracle的一項功能:http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm。
MySQL沒有這樣的東西,基本上可以通過在檢索每一行時將數字分配給php內部的數組來進行模擬,但是下次檢索結果時不能保證數字相同。你可能不得不滿足於使用主標識
你可以這樣做:
<?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++;
}
?>
這應該做你想做的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。
很好的答案,但正如你所說,即使是最少量的行,這也會非常緩慢。 +1 – 2012-03-09 13:53:56
RowID是Oracle的一項功能:http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns008.htm – Churk 2012-03-09 13:40:07
您需要什麼?您知道,行的順序不是您添加記錄的順序。 – 2012-03-09 13:40:36
當然......但我想保持簡單的帖子。事實上,我根據時間戳命令我的選擇查詢... – Marc 2012-03-09 13:45:23