2016-10-11 2 views
1

У меня есть проблемы со следующим запросом: (берегитесь, длинный запрос !!)выбора последнего сообщения в категории

SELECT 
      c.frm_category_id, 
      c.name, 
      c.slug, 
      s.frm_category_id, 
      s.name, 
      s.slug, 
      s.description, 
      IFNULL(topics_count,0), 
      IFNULL(messages_count,0), 
      n.frm_message_id, 
      n.user_id, 
      n.frm_topic_id, 
      n.timestamp, 
      n.title, 
      n.slug, 
      u.account_type, 
      u.username 
FROM 
      frm_categories AS c 
LEFT JOIN(
      SELECT 
        frm_category_id, 
        parent_frm_category_id, 
        name, 
        slug, 
        description 
      FROM 
        frm_categories 
      WHERE 
        parent_frm_category_id != 0 
) AS s 
      ON 
        c.frm_category_id = s.parent_frm_category_id  
LEFT JOIN(
      SELECT 
        frm_category_id, 
        frm_topic_id, 
        COUNT(frm_topic_id) AS topics_count 
      FROM 
        frm_topics 
      GROUP BY 
        frm_category_id 
) AS t 
      ON 
        s.frm_category_id = t.frm_category_id 
LEFT JOIN(
      SELECT 
        COUNT(frm_message_id) AS messages_count, 
        frm_topic_id, 
        frm_category_id 
      FROM 
        frm_messages 
      GROUP BY 
        frm_category_id 
) AS m 
      ON 
        t.frm_topic_id = m.frm_topic_id 
LEFT JOIN(
      SELECT 
        MAX(m.frm_message_id) AS frm_message_id, 
        m.user_id, 
        m.frm_category_id, 
        m.frm_topic_id, 
        m.timestamp, 
        t.title, 
        t.slug 
      FROM 
        frm_messages AS m, 
        frm_topics AS t 
      WHERE 
        m.frm_topic_id = t.frm_topic_id 
      GROUP BY 
        m.frm_topic_id 
) AS n 
      ON 
        s.frm_category_id = n.frm_category_id 
LEFT JOIN 
        users AS u 
      ON 
        n.user_id = u.user_id 
      WHERE 
        c.parent_frm_category_id = 0 
ORDER BY 
      c.frm_category_id ASC, 
      s.frm_category_id ASC 

Объяснение:

ВЫБРАТЬ => Я выбираю category_id, имя и пробковая категория РОДИТЕЛЕЙ (потому что WHERE parent_frm_category_id = 0)

FIRST LEFT JOIN => Я выбираю дочерние категории родительской категории (более 1)

ВТОРОГО LEFT JOIN => Я сосчитать все темы в каждой подкатегории

ТРЕТИЙ LEFT JOIN => Я считаю все сообщения в каждой подкатегории

ЧЕТВЕРТЫЙ СЛЕВА РЕГИСТРИРУЙТЕСЬ => Я выбираю последнее сообщение каждой подкатегории (, где она идет неправильно)

ПЯТЫЙ LEFT JOIN => Я выбираю ACCOUNT_TYPE и имя последнего сообщения каждой подкатегории

в чем проблема?

Я не выбираю последнее сообщение, а случайное сообщение.

Может кто-нибудь помочь мне с этим? :)

Заранее благодарен!

+0

Попробуйте с правом присоединиться вместо левого на четвёртую присоединиться. – solarc

+0

это не работает. с правом присоединения я не получаю все подкатегории, только последние. – yesterday

ответ

1

ли получить это то, что вам нужно:

SELECT c.frm_category_id, 
     c.name, 
     c.slug, 
     s.frm_category_id, 
     s.name, 
     s.slug, 
     s.description, 
     IFNULL(topics_count,0), 
     IFNULL(messages_count,0), 
     n.frm_message_id, 
     n.user_id, 
     n.frm_topic_id, 
     n.timestamp, 
     n.title, 
     n.slug, 
     u.account_type, 
     u.username 
FROM frm_categories AS c 
    LEFT JOIN frm_categories s ON s.frm_category_id = c.parent_frm_category_id AND s.parent_frm_category_id != 0 
    LEFT JOIN(
     SELECT frm_category_id, 
       COUNT(frm_topic_id) AS topics_count 
     FROM frm_topics 
     GROUP BY frm_category_id 
    ) AS t ON t.frm_category_id = s.frm_category_id 
    LEFT JOIN(
      SELECT COUNT(frm_message_id) AS messages_count, 
        frm_category_id 
      FROM frm_messages 
      GROUP BY frm_category_id 
    ) AS m ON m.frm_category_id = t.frm_category_id 
    LEFT JOIN(
      SELECT MAX(m.frm_message_id) AS frm_message_id, 
        m.user_id, 
        m.frm_category_id, 
        m.frm_topic_id, 
        m.timestamp, 
        t.title, 
        t.slug 
      FROM frm_messages AS m, 
        frm_topics AS t 
      WHERE m.frm_topic_id = t.frm_topic_id 
      GROUP BY m.frm_category_id 
    ) AS n ON s.frm_category_id = n.frm_category_id 
    LEFT JOIN users AS u ON n.user_id = u.user_id 
WHERE c.parent_frm_category_id = 0 
ORDER BY c.frm_category_id ASC, s.frm_category_id ASC 
Смежные вопросы