2014-10-30 3 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 

Если кто-нибудь может подтолкнуть меня в правильном направлении, что было бы здорово.

EDIT:

Я думаю, что, возможно, потребуется подзапрос такой 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

+0

@Phil Да, я отредактировал вопрос с помощью Я думаю, что мне нужно, но где бы я тогда включил эту команду в свой первоначальный запрос? Если возможно, я хотел бы избежать необходимости запуска двух отдельных запросов. – Qub1

ответ

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. EDIT: Я добавил обновленный код к своему сообщению для будущей справки – Qub1

+0

Я думаю, что это слишком широкий вопрос для SO. Руководство содержит целую главу об общих функциях и GROUP BY, – Strawberry

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

Отсюда «неоднозначная» заметка. Должен быть исполняемым сейчас –

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

1

Вы можете использовать LEFT JOIN and 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

+0

@ Qub1: Нет, если вы не используете левое соединение, всякий раз, когда вы нет темы для форума, он не отобразит этот форум в результате – anhlc

+0

... а также с категориями – Strawberry

Смежные вопросы