php - SQL:论坛按行为排序(在 Codeigniter 中)

标签 php mysql sql codeigniter sql-order-by

情况如下:

在我的数据库中,我有一个包含线程的表和一个包含回复的表。两者都有一个时间戳字段。

现在我正在开发一个论坛,并希望通过以下方式订购主题:

  • 如果线程有回复,则:ORDER BY tblReply.Timestamp DESC
  • 否则,该线程没有回复:ORDER BY tblThread.Timestamp DESC

我不知道如何将这两个结合在一个声明中。

我现在的查询:

SELECT `PK_ThreadID`, `Title`, `tblUsers`.`Username`, `tblThread`.`Date`, count(tblReply.FK_ThreadID) AS number_replies FROM (`tblThread`) 
JOIN `tblUsers` ON `tblUsers`.`PK_UserID` = `tblThread`.`FK_UserID` 
LEFT JOIN `tblReply` ON `tblReply`.`FK_ThreadID` = `tblThread`.`PK_ThreadID` 
WHERE `isExpertQuestion` = 0 AND `isPublic` = 1 
GROUP BY `PK_ThreadID` 
ORDER BY max(tblReply.Date)` desc   

//Here it only orders by reply date, so threads with no replies appear at the bottom

如何在此查询中实现我想要的排序?

最佳答案

大概是这样的:

SELECT `PK_ThreadID`, `Title`, 
`tblUsers`.`Username`, 
`tblThread`.`Date`, 
count(tblReply.FK_ThreadID) AS number_replies 
FROM (`tblThread`) 
JOIN `tblUsers` ON `tblUsers`.`PK_UserID` = `tblThread`.`FK_UserID` 
LEFT JOIN `tblReply` ON `tblReply`.`FK_ThreadID` = `tblThread`.`PK_ThreadID` 
WHERE `isExpertQuestion` = 0 AND `isPublic` = 1 
GROUP BY `PK_ThreadID` 
ORDER BY 
CASE WHEN COUNT(tblReply.FK_ThreadID) > 0 THEN tblReply.Timestamp 
     WHEN COUNT(tblReply.FK_ThreadID) = 0 OR tblReply.FK_ThreadID IS NULL
THEN tblThread.Timestamp 
END DESC

关于php - SQL:论坛按行为排序(在 Codeigniter 中),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10767468/

相关文章:

mysql - 我应该如何查询才能获取我的记录?

mysql - 将记录匹配到今天时出现 SQL 语法错误

PHP MySQL SELECT 文本被截断

php - Laravel 插入和检索关系

sql - 如何在过程中使用临时表,Postgresql

mysql - 每个用户的评论数量 - mysql

mysql - 多对一hibernate在删除一个时删除多个?

php - codeigniter 加载 View 特定的 javascript

php - 如何清除 Smarty 的缓存

MySQL从特定的相关记录中获取所有数据