我的网站上有一个几乎完美的简单论坛。如此接近,但到目前为止......
以下 SQL 用于创建论坛的首页 View ,用户可以在其中查看主题以及回复者的摘要:
SELECT COUNT(forumtopics.forumtopicline) AS totalthreads
, forumtopicline
, forumtopics.whenadded AS threaddate
, forumtopics.whoadded AS author
, forumtopics.title
, COUNT(forumreply.forumtopic) AS replies
, MAX(forumreply.whenadded) AS replydate
, forumreply.whoadded AS replier
FROM forumtopics
LEFT JOIN forumreply ON forumtopicline = forumreply.forumtopic
WHERE forumtopics.topic LIKE '%%'
OR forumtopics.title LIKE '%%'
OR forumreply.reply LIKE '%%'
GROUP BY forumtopicline
ORDER BY
CASE
WHEN COUNT(forumreply.forumtopic) > 0 THEN MAX(forumreply.whenadded)
WHEN COUNT(forumreply.forumtopic) = 0
OR forumreply.forumtopic IS NULL THEN MAX(forumtopics.whenadded)
END
DESC
LIMIT 0 , 30
这项工作几乎完美地完成。这为我提供了线程开始的日期、线程作者和最后回复的日期,并且它正确地对它们进行了排名,最新回复的帖子位于顶部。
问题在于
MAX( forumreply.whenadded ) AS replydate, forumreply.whoadded AS replier
这将返回最后一个帖子的日期,但无论日期如何,都会返回第一个响应者的姓名。我确信必须有一种方法来完成这个相当优雅的 SQL 以避免应用程序级别的操作。非常感谢任何帮助。显然,我需要 forumreply.whoadded 与 MAX(forumreply.whenadded) 位于同一行
数据库=Mysql。架构:
CREATE TABLE forumtopics (
forumtopicline SERIAL
,title VARCHAR(256)
,topic TEXT
,whenadded DATETIME
,whoadded VARBINARY(128)
,whenaltered DATETIME
,whoaltered VARBINARY(128)
,inuse BOOL
);
CREATE TABLE forumreply (
forumreplyline SERIAL
,forumtopic BIGINT
,reply TEXT
,whenadded DATETIME
,whoadded VARBINARY(128)
,whenaltered DATETIME
,whoaltered VARBINARY(128)
,inuse BOOL
);
最佳答案
试试这个:
SELECT
totalthreads,
forumtopicline,
threaddate,
author,
title,
replies,
replydate,
(
SELECT
fr.whoadded
FROM
forumreply fr
WHERE
fr.forumtopic = forumtopicline
AND fr.reply LIKE '%%'
AND fr.whenadded = replydate
) as replier
FROM (
SELECT COUNT(forumtopics.forumtopicline) AS totalthreads
, forumtopicline
, forumtopics.whenadded AS threaddate
, forumtopics.whoadded AS author
, forumtopics.title
, COUNT(forumreply.forumtopic) AS replies
, MAX(forumreply.whenadded) AS replydate
, forumreply.whoadded AS replier
FROM forumtopics
LEFT JOIN forumreply ON forumtopicline = forumreply.forumtopic
WHERE forumtopics.topic LIKE '%%'
OR forumtopics.title LIKE '%%'
OR forumreply.reply LIKE '%%'
GROUP BY forumtopicline
ORDER BY
CASE
WHEN COUNT(forumreply.forumtopic) > 0 THEN MAX(forumreply.whenadded)
WHEN COUNT(forumreply.forumtopic) = 0
OR forumreply.forumtopic IS NULL THEN MAX(forumtopics.whenadded)
END
DESC
) as tmp
关于mysql - 选择 2 列,最多选择一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16854198/