2011-01-31 53 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);