在一个MySQL语句中运行多个查询以获取行数

时间:2011-11-13 19:49:59

标签: mysql sql execution

我正在尝试将论坛帖子计算在内。我有两张桌子:

ThreadsReplies

Threads表的结构如下:

Id
ForumId
Last Poster
Title
Text

Replies表的结构如下:

Id
ThreadId
Text

我要做的是获取一个ForumId中的回复和主题总数。 我看着谷歌,但仍然没有运气。

我将如何做到这一点?

我这样做的原因是因为我的帖子太多而我的旧方法很慢。

2 个答案:

答案 0 :(得分:1)

Join是你最好的朋友。

选择每个ForumId中的线程数+回复数

select ForumId, count(*) from Threads,Replies
where Threads.id=Replies.ThreadId
group by ForumId

如果你知道ForumId(我们称之为x):

select count(*) from Threads,Replies
where Threads.id=Replies.ThreadId and ForumId=x

使用php和mysql_ functions运行查询的基本步骤

  1. $ sql =以上查询之一
  2. $ result = mysql_query($ sql);
  3. $ result = mysql_fetch_array($ result);
  4. $ count = $ result [0];
  5. echo $ count

答案 1 :(得分:0)

以下查询返回一行包含两个字段,其中包含给定论坛的回复计数和主题计数(将1替换为实际的论坛ID)

SELECT COUNT(*) ReplyCount, COUNT(DISTINCT ThreadId) ThreadCount
FROM Replies
WHERE ThreadId IN (SELECT Id FROM Threads WHERE ForumId = 1)

您也可以使用以下语法:

SELECT COUNT(*) ReplyCount, COUNT(DISTINCT ThreadId) ThreadCount
FROM Replies JOIN Threads ON Replies.ThreadId = Threads.Id
WHERE ForumId = 1

甚至这个:

SELECT 
    (
        SELECT COUNT(*)
        FROM Replies JOIN Threads ON Replies.ThreadId = Threads.Id
        WHERE ForumId = 1
    ) ReplyCount,
    (
        SELECT COUNT(*) FROM Threads
        WHERE ForumId = 1
    ) ThreadCount

顺便说一下,您需要使用索引正确支持查询以获得良好的性能。乍一看,这包括索引Replies.ThreadIdThreads.ForumId(除了“正常”PK索引)。有关索引和性能主题的精彩介绍,我热烈建议您阅读Use The Index Luke!

但是,如果您使用InnoDB存储引擎,请注意您为二级索引支付的费用(请参阅this article中的“群集的缺点”部分)。