2011-01-31 50 views
2

我在需要以奇怪方式排序的數據庫中有信息。下面我有一個非常簡化的版本。通過NextPageID字段排序數組

我需要它們按照由NEXTPAGEID列指定的順序使用PHP輸出。有人告訴我只是循環訪問這些值,但我無法弄清楚像這樣循環它們的正確方法。

ID: 1; NEXTPAGEID: 3 
ID: 3; NEXTPAGEID: 118 
ID: 9; NEXTPAGEID: 10 
ID: 10; NEXTPAGEID: 515 
ID: 11; NEXTPAGEID: 12 
ID: 118; NEXTPAGEID: 9 

所以我真正需要的順序是

ID: 1, 3, 118, 9, 10, 515, (whatever the NEXTPAGEID of 515 is) 

回答

2

這就要求其MySQL缺乏遞歸查詢支持。

你可以效仿這樣的:

SELECT @r := 1, @c := 0 -- the first id 

SELECT t.* 
FROM (
     SELECT @r AS _current_id, 
       @r := 
       (
       SELECT nextpageid 
       FROM mytable 
       WHERE id = _current_id 
       ) AS _next_id, 
       @c := @c + 1 AS _orderer 
     FROM mytable t 
     ) q 
JOIN mytable t 
ON  t.id = q._current_id 
ORDER BY 
     _orderer 
+0

這似乎是工作。我無法完全正確地執行其他PHP方法。 – jmcgaha 2011-01-31 20:23:09

+0

這是一種工作方式,但實際上並沒有對返回的結果進行排序。它只是添加一個具有正確排序的額外列(_current_id),但它不會重新排列原始ID列。 – jmcgaha 2011-01-31 21:57:03

+0

@jaxbulls:現在就試試。 – Quassnoi 2011-01-31 21:59:50

1
SELECT * FROM `table_name` ORDER BY `NEXTPAGEID` ASC 
0

如果你不想做遞歸SQL查詢,您可以在PHP排序:

function sort_by_nextpageid($array) { 

    $index = array(); 
    foreach($array as $row) $index[$row['ID']] = $row; 

    $result = array(); 
    $id = 1; 
    while (isset($index[$id])) { 
     $result[] = $index[$id]; 
     $id = $index[$id]['NEXTPAGEID']; 
    } 

    return $result; 
} 

並調用該函數像這樣:

// rows from the db 

$array = array(
    array('ID' => 1, 'NEXTPAGEID' => 3), 
    array('ID' => 3, 'NEXTPAGEID' => 118), 
    array('ID' => 9, 'NEXTPAGEID' => 10), 
    array('ID' => 10, 'NEXTPAGEID' => 515), 
    array('ID' => 11, 'NEXTPAGEID' => 12), 
    array('ID' => 118, 'NEXTPAGEID' => 9), 
); 

$array = sort_by_nextpageid($array); 
-1
$query = "SELECT * FROM `table_name`"; 
$result = mysql_result($query); 

if(mysql_num_rows($result)>0){ 
    while($rows=mysql_fetch_assoc($result)){ 
    $testArray[] = $rows[ID]; 
    $testArray[] = $rows[NEXTPAGEID]; 
} 

$result2 = array_unique($result); 
$lastArray=array_values($result2);