SQL - 在这种情况下可以使用 COUNT() 吗?

Posted

技术标签:

【中文标题】SQL - 在这种情况下可以使用 COUNT() 吗?【英文标题】:SQL - Is COUNT() possible in this situation? 【发布时间】:2013-11-14 23:56:24 【问题描述】:

我正在做一个需要我从草图构建论坛系统的项目

但是我遇到了一个关于 SQL 的问题

我正在使用 Derby 数据库。

表结构如下。

表论坛主题( TID INTEGER NOT NULL 始终作为 IDENTITY 生成(从 1 开始,按 1 递增)主键, TTitle varchar(50) 非空, UID 整数非空, CID Char(7) 非空, 粘性布尔值不为空, 状态字符(1) ) ==========一个话题的内容和回复======== 表论坛主题内容( RID INTEGER NOT NULL 始终作为标识生成(从 1 开始,按 1 递增)主键, Rcontent varchar(10000) 不为空, RTime 时间戳不为空, REditTime时间戳, UID 整数非空, TID 整数非空, 状态字符(1) ) 表用户 ( UID INTEGER NOT NULL 始终作为 IDENTITY 生成(从 1 开始,按 1 递增)主键, UName varchar(50) NOT NULL, UNick varchar(50) 非空, ULoginName varchar(16) NOT NULL, Upwd varchar(16) 非空, UPic varchar(200), UType Char(1) NOT NULL ) =========外键========== ALTER TABLE 论坛主题内容 添加约束 Forum_reply_fk_thread 外键 (TID) REFERENCES ForumThread(TID); 更改表论坛主题 添加约束 forum_thread_fk_User Foreign Key (UID) References Users(UID);

在论坛中显示单线程的UI设计将显示以下信息。每页显示 10 个线程

主题标题 (ForumThread.TTitle) 主题作者(Users.UNick) 该线程中的回复数 最新回复时间(ForumThreadContent RTime) 最新回复者昵称 (Users.UNick)

我的 SQL 语句。

SELECT ftc.tid ,ft.TTitle, ss.uNick as "Author", s.Unick as "Last replied by" , MAX(ftc.RTIME) as "Last Reply Time", COUNT(*) AS "Posts Count"
FROm ForumThreadContent ftc, Users s, ForumThread ft, Users ss
WHERE ftc.UID = s.UID
      AND ftc.TID = ft.TID 
      AND ft.UID = ss.UID
Group by ftc.tid , ft.ttitle , s.uNick , ss.uNick
Having MAX(ftc.RTIME) IN (SELECT MAX(ftcc1.RTime) 
                      FROM ForumThreadContent ftcc1 
                      WHERE ftc.TID = ftcc1.tid)

这个语句可以正常执行。 假设 TID "1" 中有 3 个回复,当我运行它时, COUNT(*) 只计算 tid: 1 的“2”。 说清楚:

ForumThreadContent 中的 3 行具有 TID 的外键“1” 3 行中的第一行具有 UID 的外键“1” 其余的都有一个 UID 的外键“2”

在这种情况下是否可以正确执行 count() 函数?我的 SQL 永远无法得到大于 2 的数字。

【问题讨论】:

【参考方案1】:

这可能对你有用。请检查一次列名

SELECT t1.tid, t1.Title, t1.Author, s1.Unick as 'Last replied by', ftc1.Rtime as 'last reply time', t1.count
FROM
(SELECT ftc.tid, ft.Title, s.UID, s.Unick as 'Author', COUNT(*) as count FROM 
ForumThreadContent ftc, Users s, ForumThread ft
where ftc.TID = ft.TID
and ft.UID = s.UID
group by ftc.tid, ft.title, s.UID) t1, Users s1, ForumThreadContent ftc1
where ftc1.rtime = (select max(rtime) from ForumThreadContent ftc2 where ftc2.tid = t1.tid)
and ftc1.uid = s2.uid

【讨论】:

以上是关于SQL - 在这种情况下可以使用 COUNT() 吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥在这种情况下 Array 的元素是可选的?

sql中 group by 的优先级高 还是 join的优先级高?

如何在分组count查询情况下将count的字段再分组

在这种特定情况下,SQL Server 会始终短路吗?

[SQL] 请教一下 count里面有case when 一般情况下啥时候用

[SQL] 请教一下 count里面有case when 一般情况下啥时候用