MySQL-запрос для иерархической структуры таблицы

Я пытаюсь создать систему комментариев ниже моих статей, где пользователи также могут отвечать на комментарии. Комментировать или его ответ могут только зарегистрированные пользователи.

Там я создал 4 таблицы в MySQL.

Таблица пользователей

<style type="text/css">
 table.tableizer-table {
 border: 1px solid #CCC; font-family: Arial, Helvetica, sans-serif;
 font-size: 12px;
} 
.tableizer-table td {
 padding: 4px;
 margin: 3px;
 border: 1px solid #ccc;
}
.tableizer-table th {
 background-color: #104E8B; 
 color: #FFF;
 font-weight: bold;
}
</style>
<table class="tableizer-table">
<tr class="tableizer-firstrow"><th>id</th><th>email</th></tr>
 <tr><td>1</td><td>abc@gmail.com</td></tr>
 <tr><td>2</td><td>xyz@gmail.com</td></tr>
 <tr><td>3</td><td>pqr@gmail.com</td></tr>
 <tr><td>4</td><td>abc@yahoo.com</td></tr>
 <tr><td>5</td><td>xyx@yahoo.com</td></tr>
</table>

Таблица профиля

<style type="text/css">
 table.tableizer-table {
 border: 1px solid #CCC; font-family: Arial, Helvetica, sans-serif;
 font-size: 12px;
} 
.tableizer-table td {
 padding: 4px;
 margin: 3px;
 border: 1px solid #ccc;
}
.tableizer-table th {
 background-color: #104E8B; 
 color: #FFF;
 font-weight: bold;
}
</style>
<table class="tableizer-table">
<tr class="tableizer-firstrow"><th>id</th><th>user_id</th><th>fname</th><th>lname</th></tr>
 <tr><td>1</td><td>3</td><td>PQR</td><td>Gmail</td></tr>
 <tr><td>2</td><td>2</td><td>XYZ</td><td>Gmail</td></tr>
 <tr><td>3</td><td>1</td><td>ABC</td><td>Gmail</td></tr>
 <tr><td>4</td><td>5</td><td>XYZ</td><td>Yahoo</td></tr>
 <tr><td>5</td><td>4</td><td>ABC</td><td>Yahoo</td></tr>
</table>

Таблица статей

<style type="text/css">
 table.tableizer-table {
 border: 1px solid #CCC; font-family: Arial, Helvetica, sans-serif;
 font-size: 12px;
} 
.tableizer-table td {
 padding: 4px;
 margin: 3px;
 border: 1px solid #ccc;
}
.tableizer-table th {
 background-color: #104E8B; 
 color: #FFF;
 font-weight: bold;
}
</style>
<table class="tableizer-table">
<tr class="tableizer-firstrow"><th>id</th><th>article_title</th><th>article_content</th></tr>
 <tr><td>1</td><td>Helooooooo</td><td>Hi, How are you?</td></tr>
 <tr><td>2</td><td>Hiiiiiiiiiiii</td><td>Hey, How are you?</td></tr>
 <tr><td>3</td><td>Heeeeeey</td><td>Hello, How are you?</td></tr>
</table>

Таблица комментариев

<style type="text/css">
 table.tableizer-table {
 border: 1px solid #CCC; font-family: Arial, Helvetica, sans-serif;
 font-size: 12px;
} 
.tableizer-table td {
 padding: 4px;
 margin: 3px;
 border: 1px solid #ccc;
}
.tableizer-table th {
 background-color: #104E8B; 
 color: #FFF;
 font-weight: bold;
}
</style>
<table class="tableizer-table">
<tr class="tableizer-firstrow"><th>id</th><th>article_id</th><th>user_id</th><th>parent_comment_id</th><th>Comment</th></tr>
 <tr><td>1</td><td>2</td><td>5</td><td>0</td><td>Great Article</td></tr>
 <tr><td>2</td><td>2</td><td>2</td><td>0</td><td>Nice Article</td></tr>
 <tr><td>3</td><td>2</td><td>4</td><td>1</td><td>I agree Great Article</td></tr>
 <tr><td>4</td><td>2</td><td>1</td><td>1</td><td>I also agree Great Article</td></tr>
 <tr><td>5</td><td>2</td><td>3</td><td>0</td><td>Bad Article</td></tr>
 <tr><td>6</td><td>2</td><td>4</td><td>2</td><td>OK Artilce</td></tr>
</table>

Я хочу, чтобы мой вывод отображался как:

Name: XYZ Yahoo (Comment)
Great Article   

Name: ABC Yahoo (Reply on 1st Comment)
I agree Great Article

Name: ABC Gmail (Reply on 1st Comment)
I also agree Great Article

Name: XYZ Gmail (Comment)
Nice Article    

Name: ABC Yahoo (Reply on 2nd Comment)
OK Artilce

Name: PQR Gmail (Comment)
Bad Article 

В приведенной выше системе комментариев я использую иерархическую структуру таблиц для хранения комментариев и их ответов.

Надеюсь, я смог объяснить мою проблему.

Может кто-нибудь помочь мне с оператором MySQL и PHP-кодом

1 ответ

Решение

Я бы немного подправил порядок по пунктам, чтобы вы получили все записи в правильном порядке на стороне php, чтобы вы могли просто перебирать набор результатов.

$sql = 'SELECT  c.id, parent_comment_id,`comment`, p.fname, p.lname FROM comment c INNER JOIN profile p on c.user_id=p.user_id INNER JOIN WHERE article_id='.$article_id . ' ORDER BY IF(parent_comment_id=0,id,parent_comment_id) ASC, id ASC;'

Зацикливая результат в php, я бы построил массив для хранения идентификаторов каждой записи, чтобы определить их ранг в комментариях. Хотя, я должен отметить, что на форумах вы редко видите ссылку на то, что комментарий является ответом на первый комментарий, обычно вы можете видеть, что комментарий является ответом на комментарий, сделанный sy в то или иное время. В любом случае, вспомогательный массив может содержать имена пользователей и временные метки записей.

//outside the loop
//initialise rowcount variable to 0
$rowcount=0
...

//within the loop
//rowcount variable
$rowcount++;
$helper[$row['id']]=$rowcount;
...
//if a comment has a parent comment, get the parent's rownumber
echo 'Reply to ' . $helper[$row['parent_comment_id']] . '. comment';
Другие вопросы по тегам