Соедините две таблицы несколько раз - PullRequest
1 голос
/ 09 августа 2011

Мне нужен результат из двух таблиц, одна из которых является родительской таблицей, а другая - дочерней, а также родительской таблицей для дочерних записей подуровня.

если я выполняю SQL-запрос, например:

   SELECT cc.collection_id, cc.title, cc.type, cc.alias as forum_alias,
           SUBSTRING(cc.description,1,200) as short_desc, 
           COUNT(b1.boardmessage_id) as total_threads,
           COUNT(b2.boardmessage_id) as total_replies 

   FROM contentcollections cc 
        JOIN boardmessages b1 ON b1.parent_id = cc.collection_id  
        JOIN boardmessages b2 ON b2.collection_id = cc.collection_id 

   WHERE cc.type=1 
         AND cc.is_active=1 
         AND b1.parent_type='collection' 
         AND b1.is_active=1 
         AND b2.parent_type IN('message','reply','reply_on_reply') 
   GROUP BY cc.collection_id 
   ORDER BY cc.created DESC;

это дает мне неправильный результат с таким же количеством общих потоков и таким же количеством общих ответов. Но когда я делаю что-то подобное

SELECT cc.collection_id, cc.title,cc.type, cc.alias as forum_alias,
       SUBSTRING(cc.description,1,200) as short_desc,
       (SELECT COUNT(boardmessage_id) 
        FROM boardmessages 
        WHERE parent_type='collection' 
              AND collection_id=cc.collection_id 
              AND is_active=1) as total_threads,
       (SELECT count(boardmessage_id) 
        FROM boardmessages
        WHERE parent_type IN('message','reply','reply_on_reply') 
              AND collection_id=cc.collection_id AND is_active=1) as total_replies 
FROM contentcollections cc
WHERE cc.type=? AND cc.is_active=? 
ORDER BY cc.created DESC

Это дает мне правильный ответ.

Я подозреваю, что я использую подзапросы во втором варианте, так что это может замедлить производительность рендеринга страницы.

Пожалуйста, предложите мне то же самое. Любая помощь или предложение будут с благодарностью.

Спасибо

1 Ответ

1 голос
/ 09 августа 2011

Заменить:

COUNT(b1.boardmessage_id) as total_threads,
COUNT(b2.boardmessage_id) as total_replies 

С:

COUNT(DISTINCT b1.boardmessage_id) as total_threads,
COUNT(DISTINCT b2.boardmessage_id) as total_replies 

, если вы хотите, чтобы каждая строка считалась один раз вместо значения по умолчанию, считая все комбинации. Если у вас есть 3 строки в b1 и 5 строк в b2, вы получите в общей сложности 15 строк, и оба подсчета возвращают, что есть 15 строк, с отличительным флагом вы получите ответы 3 и 5 вместо этого, поскольку его 3 различных значения в b1 и 5 различных значений в b2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...