簡體   English   中英

MySQL獲取另一個表中所有行的計數,其中值等於當前表中的列

[英]MySQL get count of all rows in another table where the value equals column in current table

我正在用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_forumsforum_threadsforum_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

您可以使用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

我懷疑關於聚合函數的入門級教程無法涵蓋這一點,但是無論如何...

 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代替

要獲得簡化示例所需的結果,請運行

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 

在偽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

使用更簡單的表:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM