2014-10-30 54 views
0

我正在用PHP编程一个论坛,所以我来到了需要计算线程数量的部分一个论坛。我使用下面的查询来获取所有论坛和各自的类别:MySQL获得另一个表中所有行的值,该值等于当前表中的列数

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 
+0

您应该可以通过COUNT()和GROUP BY来实现此目的 – Phil 2014-10-31 00:02:11

+0

@Phil是的,我已经使用计数命令我认为我需要,但是我会在哪里将这个命令合并到我的原始查询中?如果可能的话,我想避免必须运行两个单独的查询。 – Qub1 2014-10-31 00:03:42

回答

1

我怀疑有在聚集功能的入门级教程,不能覆盖这一点,但无论如何...

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而不是

+0

谢谢,这个作品。无论如何,你是否可以解释为什么没有GROUP BY部分,这个声明不起作用?我对MySQL还是比较新的。 编辑:我已将更新后的代码添加到我的帖子中供将来参考 – Qub1 2014-10-31 00:19:45

+0

我认为这对于SO来说太宽泛了。手册包含了关于聚合函数和GROUP BY的全部内容, – Strawberry 2014-10-31 01:11:26

0

为了得到你想要的结果的简单的例子,运行

SELECT f.id, f.name, COUNT(*) AS threads 
FROM `forum_forums` f 
INNER JOIN `forum_threads_forums` r ON r.forum_id = f.id 
INNER JOIN `forum_threads` t ON t.id = r.thread_id 
GROUP BY f.id 
ORDER BY f.id 
0

在伪SQL:

SELECT f.id, f.name, COUNT(t.thread_id) FROM forum_threads_forums AS t 
JOIN forum_forums AS f ON t.forum_id=f.id 
GROUP BY t.forum_id 
+0

因此,'暧昧'的说明。应该现在可执行 – 2014-10-31 00:17:00

0

使用您的简单表:

SELECT 
    forum_forums.id, 
    forum_forums.name, 
    COUNT(forum_threads_forums.thread_id) as threadCount 
FROM 
    forum_forums JOIN forum_threads_forums on forum_threads_forums.forum_id = forum_forums.id 
GROUP BY 
    forum_forums.id 

http://sqlfiddle.com/#!2/aeb7f/3

+0

会工作,但它只会选择其中有线程的论坛 – Qub1 2014-10-31 00:20:57

1

您可以使用LEFT JOIN和GROUP BY:

SELECT f.id 
     , f.name 
     , f.description 
     , c.id category_id 
     , c.name category_name 
     , c.description category_description, 
     , COUNT(ft.thread_id) as threads 
     FROM forum_forums f 
     LEFT JOIN forum_forums_categories fc 
     ON f.id = fc.forum_id 
     LEFT JOIN forum_categories c 
     ON fc.category_id = c.id 
     LEFT JOIN forum_threads_forums ft 
     ON f.id = ft.forum_id 
     GROUP BY f.id 
+0

与@Strawberry基本相同,它的工作原理 – Qub1 2014-10-31 00:20:28

+0

@ Qub1:不,如果您不使用左连接,只要您有没有线程的论坛,它不会显示该论坛中的结果 – anhlc 2014-10-31 01:01:02

+0

...同样与类别 – Strawberry 2014-10-31 01:13:25

相关问题