2015-05-27 3 views
2

У меня возникли проблемы с получением 3 последних комментариев из двух разных таблиц.Получить последние комментарии из нескольких таблиц

Вот мой код, который отлично работает с одним внутренним соединением:

$query = mysql_query("SELECT COUNT(c.topic_id) AS ctid, COUNT(c.deck_id) AS dtid, f.id AS forumid, f.class AS forumclass, f.name AS forumname, f.url AS forumurl, 
      c.id AS commentid, c.user_id AS commentuser, c.user_name AS commentusername, c.date AS commentdate, 
      c.topic_id AS topicid, c.deck_id AS deckid 
      FROM ".$prefix."comment AS c 
      INNER JOIN ".$prefix."forum AS f 
      ON c.topic_id = f.id GROUP BY f.id 
      ORDER BY commentdate DESC LIMIT 3") or die(mysql_error()); 

Это прекрасно работает она показывает 3 Последние комментарии из таблицы форума, однако у меня есть комментарии в таблице палуб тоже, но когда Я добавляю еще один JOIN в запрос, который он больше не будет работать.

$query = mysql_query("SELECT COUNT(c.topic_id) AS ctid, COUNT(c.deck_id) AS dtid, f.id AS forumid, f.class AS forumclass, f.name AS forumname, f.url AS forumurl, 
      c.id AS commentid, c.user_id AS commentuser, c.user_name AS commentusername, c.date AS commentdate, 
      c.topic_id AS topicid, c.deck_id AS deckid, , d.id, d.url AS deckurl, d.name AS deckname 
      FROM ".$prefix."comment AS c 
      INNER JOIN ".$prefix."forum AS f 
      ON c.topic_id = f.id 
      INNER JOIN ".$prefix."decks AS d 
      ON c.deck_id = d.id 
      GROUP BY f.id ORDER BY commentdate DESC LIMIT 3") or die(mysql_error()); 

Там же комментарий таблица и в замечании таблицы есть topic_id столбец, который равен столбец ид Форума таблицы и есть также deck_id столбец, который равен Идентификатор столбец таблицы палуб в.

Очевидно, что GROUP BY f.id не подходит для двух внутренних соединений.

После этого запроса у меня есть ($ top = mysql_fetch_assoc ($ query)) {... а затем if ($ top ['deckid'] == 0), затем распечатайте информацию о топике, чтобы распечатать информацию о колодедах.

EDIT: комментарий таблица (только то, что важно для нас сейчас): идентификатор, topic_id, deck_id

topic_id = форум идентификатор таблицы

идентификатор

deck_id = палуба стола

Очевидно, что существует без комментариев к каждой теме форума.

E.g .: Forum ID 5 имеет 4 комментария, а затем таблицу комментариев, например .: ID 1,2,3,4 имеет topic_id 4,4,4,4 и deck_id 0,0,0,0.

Если комментариев нет, в таблице комментариев ничего нет. Так что в форуме ID 6 есть 0 комментариев, тогда в таблице комментариев нет ничего.

Если идентификатор колоды 12 имеет 2 комментариев, то таблица комментариев например .: 5,6 имеет deck_id 12,12 и topic_id 0,0.

Форум стол: ID

Deck стол: ID

EDIT2: Решение (не слишком хорошо, но он работает):

//count how many comments the latest 3 deck topic has 
     $new_comment_query = mysql_query("SELECT COUNT(c.deck_id) AS dtid, c.id, c.deck_id, c.date, d.id 
     FROM ".$prefix."comment AS c LEFT JOIN ".$prefix."decks AS d ON d.id = c.deck_id GROUP BY d.id ORDER BY date DESC LIMIT 3"); 
     $new_one = mysql_fetch_array($new_comment_query); 

     //count how many comments the latest 3 forum topic has 
     $new_forum_query = mysql_query("SELECT COUNT(c.topic_id) AS ctid, c.id, c.topic_id, c.date, f.id 
     FROM ".$prefix."comment AS c LEFT JOIN ".$prefix."forum AS f ON f.id = c.topic_id GROUP BY f.id ORDER BY date DESC LIMIT 3"); 
     $newer_one = mysql_fetch_array($new_forum_query); 

     //get all the comments 
     $comment_query = mysql_query("SELECT id, topic_id, deck_id, date FROM ".$prefix."comment ORDER BY date DESC LIMIT 3"); 
     while ($comment = mysql_fetch_assoc($comment_query)) 
     { 
      if($comment['topic_id']==0) 
      { 
       $deck_query = mysql_query("SELECT * FROM ".$prefix."decks WHERE id=".$comment['deck_id']); 
       while ($deck_comments = mysql_fetch_assoc($deck_query)) 
       { 
        //print all the things! 
       } 
      } 
      elseif($comment['deck_id']==0) 
      { 
       $forum_query = mysql_query("SELECT * FROM ".$prefix."forum WHERE id=".$comment['topic_id']); 
       while ($forum_comments = mysql_fetch_assoc($forum_query)) 
       { 
        //print all the things! 
       } 
      } 
     } 
+0

Если вам нравится, рассмотрите следующий простой двухэтапный курс действий: 1.Если вы еще этого не сделали, укажите надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, предоставленной на шаге 1. – Strawberry

+0

Внутреннее соединение выбирает все строки из обеих таблиц, если существует совпадение между столбцами в обеих таблицах - может вы попробуете левое соединение вместо этого для целей тестирования? – hlh3406

ответ

0
//count how many comments the latest 3 deck topic has 
    $new_comment_query = mysql_query("SELECT COUNT(c.deck_id) AS dtid, c.id, c.deck_id, c.date, d.id 
    FROM ".$prefix."comment AS c LEFT JOIN ".$prefix."decks AS d ON d.id = c.deck_id GROUP BY d.id ORDER BY date DESC LIMIT 3"); 
    $new_one = mysql_fetch_array($new_comment_query); 

    //count how many comments the latest 3 forum topic has 
    $new_forum_query = mysql_query("SELECT COUNT(c.topic_id) AS ctid, c.id, c.topic_id, c.date, f.id 
    FROM ".$prefix."comment AS c LEFT JOIN ".$prefix."forum AS f ON f.id = c.topic_id GROUP BY f.id ORDER BY date DESC LIMIT 3"); 
    $newer_one = mysql_fetch_array($new_forum_query); 

    //get all the comments 
    $comment_query = mysql_query("SELECT id, topic_id, deck_id, date FROM ".$prefix."comment ORDER BY date DESC LIMIT 3"); 
    while ($comment = mysql_fetch_assoc($comment_query)) 
    { 
     if($comment['topic_id']==0) 
     { 
      $deck_query = mysql_query("SELECT * FROM ".$prefix."decks WHERE id=".$comment['deck_id']); 
      while ($deck_comments = mysql_fetch_assoc($deck_query)) 
      { 
       //print all the things! 
      } 
     } 
     elseif($comment['deck_id']==0) 
     { 
      $forum_query = mysql_query("SELECT * FROM ".$prefix."forum WHERE id=".$comment['topic_id']); 
      while ($forum_comments = mysql_fetch_assoc($forum_query)) 
      { 
       //print all the things! 
      } 
     } 
    } 
+0

Это не очень хороший подход. Вы должны позволить RDBMS обрабатывать тяжелую работу с вашими данными. PHP-код должен быть только для доставки результата. –

3

Попробуйте запустить этот запрос:

SELECT * FROM 
(
SELECT COUNT(c.topic_id) AS ctid, COUNT(c.deck_id) AS dtid, 
    f.id AS forumid, f.class AS forumclass, f.name AS forumname, 
    f.url AS forumurl, 
    c.id AS commentid, c.user_id AS commentuser, c.user_name AS commentusername, 
    c.date AS commentdate, c.topic_id AS topicid, c.deck_id AS deckid, 
    d.id, d.url AS deckurl, d.name AS deckname 
FROM ".$prefix."comment AS c 
INNER JOIN ".$prefix."forum AS f 
ON c.topic_id = f.id 
INNER JOIN ".$prefix."decks AS d 
     ON c.deck_id = d.id 
ORDER BY commentdate DESC 
) t1 
GROUP BY t1.forumid 
LIMIT 3 

Сначала я выполняю ваш комплекс JOINбезGROUP BY который вызывал проблемы. Затем я SELECT все из этой временной таблицы, группируя по forumid.

Честно говоря, я удивлен, что ваш сервер не был включен в ваш первый запрос, не говоря уже о втором, но, надеюсь, мой ответ поможет вам.

+0

К сожалению, это не помогло мне. Я не получил никакого результата. Однако я обновил свой первый пост более подробно, и я решил проблему «не слишком красиво». – Phoenixy

+0

Напишите ответ и отметьте его правильно. –

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