【问题标题】:Retrieving data from MySQL in particular order按特定顺序从 MySQL 检索数据
【发布时间】:2014-05-23 14:57:28
【问题描述】:

我不知道怎么问这个问题,但我会尽力而为。我正在设计一个评论和回复系统,这样每个评论都有特定数量的回复,并且 cmets 和 replay 分别存储在同一个 MySQl 数据库的两个表中,所以我们必须有两个表

表 1

评论 ID |评论 |日期

表 2

X |回复文字 |日期

其中 X 表示回复所属的评论 ID。

我知道代码

$res=mysql_query("SELECT * from commenttable ORDER BY `Date` DESC ");
while($row=mysql_fetch_array($res))
{
echo $row["Comment"];
}

列出从最近到旧的 cmets。

是否可以修改此代码以列出从回复数最多到最少的 cmets。

【问题讨论】:

  • 回答你的问题,是的,有可能。

标签: php mysql


【解决方案1】:

您可以在回复表上运行“计数”查询,然后按此排序。 我不是 SQL 专家,所以我确信这可以通过多种方式进行改进,但我希望这会让您朝着正确的方向前进:

Select commentId, count(1) as c 
from replytable
group by commentId
order by c;

你应该得到每个commentId的回复数,然后你可以根据ID从cmets表中获取cmets的数据。

进一步阅读: How to use count and group by at the same select statement http://www.w3resource.com/sql/aggregate-functions/count-with-group-by.php

【讨论】:

  • 是否可以列出零回复的cmets。
  • 应该是可以的。一种(可能是低效的)方法是select * from comments where commentid in (select commentId from comments MINUS select distinct commentId from Replies)
【解决方案2】:

我相信count() 会是您问题的答案。但在我们继续计算您在第二张桌子上的回复量之前,您可能想要加入这两张桌子。你可以使用ORDER BY count(id)

【讨论】:

    【解决方案3】:

    这样的事情应该可以工作:

    select t1.comment_id, count(t2.x) 
    FROM table1 t1 LEFT JOIN table2 t2 
    ON t1.comment_id=t2.x
    GROUP BY t1.comment_id
    ORDER BY 2 DESC
    

    【讨论】:

    • 如果 t2 中没有 t1.comment_id 的记录,可能需要使用 LEFT 或 RIGHT JOIN
    • 也许,但内连接更有意义。因为您可能想要有一些答复的问题。虽然理论上左连接是可能的。无法正确加入,因为 x 是外键,您无法回复不存在的评论。 Editleft join 确实有道理。
    • t1和table1有什么区别
    • t1 是 table1 的别名。访问它的更短的方法。不需要,只需缩短代码即可。我也可以在 ON 子句中使用 table1.comment_id = table2.x。记住,如果你想为表使用别名,你应该在 FROM 子句中定义它。
    • 博扬,什么是“FROM table1 t1 INNER JOIN table2 t2”,table1 t1代表什么?
    猜你喜欢
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-01
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多