mysql - 选择 2 列,最多选择一列

标签 mysql sql

我的网站上有一个几乎完美的简单论坛。如此接近,但到目前为止......

以下 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/

相关文章:

c# - Entity Framework 6.0 + 加密连接字符串

javascript - 用真实数据修改dojo图表x轴

java - 使用 HTTPS URL 连接到远程 mysql 数据库

java - 如何删除JPA @ManyToMany关系中的记录?

mysql - 为什么我的第 N 个最高薪水 SQL 查询语法错误?

php - Mysql Where Column A = X and Column B = Y and or Column B = Z

sql - 将文本字段中的时间值与当前时间进行比较

mysql - 数据库 - 我如何确保计算率的新变化只会影响新记录

mysql - JMETER + 关于Mysql数据库的查询

mysql - sql:使用同一键左连接多表