我正在用PHP编写一个论坛,因此,我进入了需要计算一个论坛中线程数量的部分。我正在使用以下查询来获取所有论坛及其各自的类别:
SELECT f.id
, f.name
, f.description
, c.id category_id
, c.name category_name
, c.description category_description
FROM forum_forums f
JOIN forum_forums_categories fc
ON f.id = fc.forum_id
JOIN forum_categories c
ON fc.category_id = c.id;
它完成了工作,然后我就可以将所有内容归类。接下来,我还要将某个论坛中的线程数量添加到结果的每一行中,但我不确定该怎么做。
我有以下表格:forum_forums
,forum_threads
,forum_categories
。另外,线程可以属于多个论坛(我有一个forums_threads_forums
表,其中将特定的绑定thread_id
到forum_id
)。
所以我的猜测是,我需要在原始命令中的某个地方添加一个计数。此计数将需要对forum_threads_forums
表中的行进行计数,该表中的行forum_id
等于要添加到结果中的当前论坛的行数。
为了简化起见,下面是我要实现的一个示例(简化):表: forum_forums
id name
1 forum1
2 forum2
3 forum3
桌子: forum_threads
id title
1 thread1
2 thread2
桌子: forum_threads_forums
thread_id forum_id
1 1
1 2
2 1
2 3
然后我想查询返回(除其他事项外):
forum_forums.id forum_forums.name forum.threads
1 forum1 2
2 forum2 1
3 forum3 1
如果有人可以向正确的方向推动我,那将是很棒的。
编辑:
我想我可能需要这样的子查询,SELECT COUNT(thread_id) AS thread_count FROM forum_threads_forums WHERE forum_id=:forum_id
但是我不确定将其放在我的原始查询中的位置
回答:
为了将来参考,这是我现在正在使用的工作命令:
SELECT
forum_forums.id,
forum_forums.name,
forum_forums.description,
COUNT(forum_threads_forums.thread_id) AS thread_count,
forum_categories.id AS category_id,
forum_categories.name AS category_name,
forum_categories.description AS category_description
FROM
forum_forums
LEFT OUTER JOIN
forum_threads_forums
ON
forum_forums.id=forum_threads_forums.forum_id
INNER JOIN
forum_forums_categories
ON
forum_forums.id=forum_forums_categories.forum_id
INNER JOIN
forum_categories
ON
forum_forums_categories.category_id=forum_categories.id
GROUP BY
forum_forums.id
我怀疑关于聚合函数的入门级教程未能涵盖此内容,但是无论如何...
DROP TABLE IF EXISTS forums;
CREATE TABLE forums
(forum_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,forum_name VARCHAR(12) NOT NULL UNIQUE
);
INSERT INTO forums VALUES
(1 ,'forum1'),(2,'forum2'),(3,'forum3');
DROP TABLE IF EXISTS threads;
CREATE TABLE threads
(thread_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,title VARCHAR(12) NOT NULL
);
INSERT INTO threads VALUES
(1 ,'thread1'),
(2 ,'thread2');
DROP TABLE IF EXISTS threads_forums;
CREATE TABLE threads_forums
(thread_id INT NOT NULL
,forum_id INT NOT NULL
,PRIMARY KEY(thread_id,forum_id)
);
INSERT INTO threads_forums VALUES
(1 ,1),
(1 ,2),
(2 ,1),
(2 ,3);
SELECT f.*
, COUNT(t.thread_id) threads
FROM forums f
JOIN threads_forums tf
ON tf.forum_id = f.forum_id
JOIN threads t
ON t.thread_id = tf.thread_id
GROUP
BY forum_id;
+----------+------------+---------+
| forum_id | forum_name | threads |
+----------+------------+---------+
| 1 | forum1 | 2 |
| 2 | forum2 | 1 |
| 3 | forum3 | 1 |
+----------+------------+---------+
请注意,此解决方案将不会显示没有主题的论坛。为此,您需要使用LEFT [OUTER] JOIN代替
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句