![](/img/trans.png)
[英]MySql get rows where one column equals to another colum in another table where one column is equal
[英]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_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
您可以使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.