我不知道哪种方式更适合 PHP 和 SQL。我设计并编写了自己的评论系统,我希望 id2=0 是评论,id2>0 是一个table 中的子评论。这意味着如果有人在 ID=1 的评论中写了子评论,那么 ID2 负责将(子评论)分配给 ID=1(评论)。我有一个像这样的 table comments
:
id | id2 | smt | etc.
1 | 0 | x | x //comment with sub-comment where id=3
2 | 0 | x | x //comment
3 | 1 | x | x //that is sub-comment for comment where id=1
我在 while 循环中显示这个,因为我需要打印评论中的所有数据。像这样:
$sqlkom="SELECT * FROM `comments` WHERE `id`='".$row['id']."' ORDER BY id DESC LIMIT 20";
if($resultkom = mysqli_query($con, $sqlkom)){
if(mysqli_num_rows($resultkom)){
while($rowkom = mysqli_fetch_assoc($resultkom)) {
echo HtmlFormatFunction($rowkom['id'],$rowkom['id2'],$rowkom['smt'],$rowkom['etc'])
我不会做到这一点: if($rowkom['id']==$rowkom['id2'])
没有添加另一个 while() 循环,对吧?或者修改SQL查询就可以达到这个效果?请帮助我找到正确的解决方案。
回答1
你可以加入你的 table 本身,像这样:
SELECT c.id, c.id2, c.smt, c.etc,
s.id, AS s_id, s.id2 AS s_id2, s.smt AS s_smt, s.etc AS s_etc
FROM `comments` c LEFT JOIN `comments` s
ON c.id = s.id2
WHERE c.id = ?
ORDER BY c.id DESC LIMIT 20";
然后,您应该为第一条评论获得最少一行,或者为第一条评论获得尽可能多的行,因为有子评论。然后前四个字段将重复,但这不是问题。也许这并不完美。希望你能明白。