Quello che stai descrivendo è un linked list. Il problema è che di solito sono difficili da recuperare usando solo SQL. La mia soluzione è usare PHP per eseguire l'ordinamento al momento del recupero.
La tabella sarebbe simile a questa:
CREATE TABLE page {
page_id INT,
first_comment_id INT
}
CREATE TABLE comment {
comment_id INT PRIMARY KEY AUTOINCREMENT,
page_id INT,
next_comment_id INT
}
tua domanda è semplice:
SELECT comment_id, next_comment_id
FROM comment
WHERE page_id = $page_id
ORDER BY comment_id DESC
Il passo importante è quello di massaggiare i risultati da mysql_fetch_assoc() in un array che viene indicizzato in base to commentid:
$result = mysql_query($sql);
$indexed_list = array();
while ($row = mysql_fetch_assoc($result))
{
$indexed_list[$row['comment_id']] = $row;
}
Come risultato in un array simile a questo:
$indexed_list = array(
1 => array("comment_id"=>1, "next_comment_id"=>2),
2 => array("comment_id"=>2, "next_comment_id"=>5),
3 => array("comment_id"=>3, "next_comment_id"=>4),
4 => array("comment_id"=>4, "next_comment_id"=>0),
5 => array("comment_id"=>5, "next_comment_id"=>3));
La funzione PHP per ordinarli in ordine visualizzabile è semplice:
function llsort($indexed_list, $first_comment_id)
{
$sorted_list = array();
$node = $indexed_list[$first_comment_id];
array_push($sorted_list, $node);
do
{
$node = $indexed_list[$node['next_comment_id']];
array_push($sorted_list, $node);
} while ($node['next_comment_id'] != 0
AND isset($indexed_list[$node['next_comment_id']]));
return $sorted_list;
}
Si ottiene first_comment_id dalla tabella pagina. Naturalmente, devi ancora implementare le funzioni per inserire un nodo ed eliminare un nodo, ma questi sono lasciati come esercizi per il lettore. Non dimenticare di utilizzare le transazioni per l'inserimento e l'eliminazione dei nodi.
Maggiori informazioni sulle liste collegate in MySQL:
Ricordati di ** accettare ** una risposta se ti ha aiutato a risolvere il tuo problema. –