2015-05-05 5 views
1

Моя проблема более ясна на этом посту: Select all categories with latest post, user, and topic informationРезультат запроса MySQL колеблется

----------------------------- -------------

У меня есть запрос, который вытаскивает список категорий для моего форума вместе с последним сообщением в этой категории. Результаты возвращаются, как ожидалось, за исключением того, что информация sub_post, которая вытягивается в LEFT JOIN fp1, изменяется, если вы выполняете запрос несколько раз.

Я впервые заметил эту проблему при просмотре моей веб-страницы и обновлении несколько раз. Сообщение, которое он вытаскивает, колеблется между 3 сообщениями. Я не уверен, как это возможно, если в запросе нет чего-то неправильного.

Пожалуйста, взгляните на мой запрос ниже и дайте мне знать, есть ли что-то, что я делаю неправильно, что может объяснить это странное поведение.

Cheers.

SELECT fc1.id AS cat_id, fc1.cat_name AS cat_name, 
    fc1.cat_description AS cat_description, fc1.cat_views as cat_views, fp1.* 
FROM forum_categories as fc1 
LEFT JOIN (SELECT fp2.id AS sub_post_id, 
       fp2.post_date as sub_post_date, 
       fp2.post_topic as sub_post_topic, 
       u2.id as sub_user_id, u2.username as sub_username, 
       ft2.topic_subject as sub_topic_subject, ft2.topic_cat as sub_topic_cat 
      FROM forum_posts as fp2 
      LEFT JOIN users as u2 on fp2.post_by = u2.id 
      LEFT JOIN forum_topics as ft2 on ft2.id = fp2.post_topic 
      LEFT JOIN forum_categories as fcats on fcats.id = ft2.topic_cat 
      ORDER BY fp2.id DESC) 
as fp1 on fp1.sub_topic_cat = fc1.id 
GROUP BY fc1.id; 

EXPLAIN SELECT:

+----+-------------+------------+--------+-------------------------+-------------+---------+--------------------+------+-------------+ 
| id | select_type | table  | type | possible_keys   | key   | key_len | ref    | rows | Extra  | 
+----+-------------+------------+--------+-------------------------+-------------+---------+--------------------+------+-------------+ 
| 1 | PRIMARY  | fc1  | index | PRIMARY,cat_name_unique | PRIMARY  | 8  | NULL    | 3 | Using where | 
| 1 | PRIMARY  | <derived2> | ref | <auto_key0>    | <auto_key0> | 9  | tpw.fc1.id   | 9 | NULL  | 
| 2 | DERIVED  | fp2  | index | NULL     | PRIMARY  | 8  | NULL    | 92 | NULL  | 
| 2 | DERIVED  | u2   | eq_ref | PRIMARY     | PRIMARY  | 8  | tpw.fp2.post_by | 1 | NULL  | 
| 2 | DERIVED  | ft2  | eq_ref | PRIMARY     | PRIMARY  | 8  | tpw.fp2.post_topic | 1 | NULL  | 
| 2 | DERIVED  | fcats  | eq_ref | PRIMARY     | PRIMARY  | 8  | tpw.ft2.topic_cat | 1 | Using index | 
+----+-------------+------------+--------+-------------------------+-------------+---------+--------------------+------+-------------+ 

У меня есть 3 таблицы: forums_categories, forums_topics и forums_posts. Я пытаюсь перечислить категории вместе с последним сообщением в этой категории. Форум forums_post связан с forum_topics по post_topic, а forum_topics связан с topic_categories с topic_cat.

+2

При использовании 'GROUP BY', он просто выбирает случайную строку из группы. – Barmar

+0

Если вы хотите получить первую или последнюю строку в группе, используйте http: // stackoverflow.com/questions/1313120/retrieve-the-last-record-in-each-group – Barmar

+0

Не уверен, но почему бы не так: выберите «ANY_COL» из категории слева слева. Включите any_condition (добавьте больше левых соединений в соответствии с требованиями) потому что в нашем случае наша главная цель - выбрать пост, а не категории – parveen

ответ

0

LEFT JOIN forum_categories как fcats на fcats.id = ft2.topic_cat

Я считаю, что включение этой LEFT JOIN не оказывает никакого влияния на результат, кроме как замедлить обработку. Убери это.

ORDER BY DESC fp2.id

что ORDER BY не оказывает никакого влияния на результат, потому что GROUP BY не будет заботиться. Убери это.

Если ни один из тех, кто помогает, то объяснить это:

Сообщение, что он тянет колеблется от 3 сообщений.

И предоставьте EXPLAIN SELECT ...

+0

Я внесла свои изменения, но запрос по-прежнему не ведет себя правильно. То, что я подразумеваю под столкновением, заключается в том, что когда я запускаю запрос несколько раз, я получаю разные результаты для информации, вытащенной в fp1 LEFT JOIN. Я получаю разные сообщения, если я продолжаю выполнять запрос, который не имеет смысла. –

+0

У меня есть 3 таблицы: forums_categories, forums_topics и forums_posts. Я пытаюсь перечислить категории вместе с последним сообщением в этой категории. Форум forums_post связан с forum_topics по post_topic, а forum_topics связан с topic_categories с topic_cat. Возможно, я ошибаюсь. –

+0

Предполагая, что ваш ответ работает, вы можете также «принять» его и проигнорировать мою. –

1

Это была решена _pala на этой другой вопрос: https://stackoverflow.com/a/30048334/4864675

Я собирался о запросе неправильно, который приходится на странное поведение. Спасибо _pala!

Вот SQL, который работал его для меня, предоставленной пользователем _pala:

select fc.cat_name, fc.cat_description, fc.cat_views, u.username, fp.post_date, ft.topic_subject 
    from forum_categories fc 
inner join forum_topics ft 
    on fc.id = ft.topic_cat 
inner join forum_posts fp 
    on fp.post_topic = ft.id 
inner join users u 
    on fp.post_by = u.id 
inner join (
    select topic_cat, max(fp.id) most_recent_post 
    from forum_topics ft 
     inner join forum_posts fp 
     on fp.post_topic = ft.id 
    group by topic_cat 
) q 
    on q.topic_cat = ft.topic_cat 
    and fp.id = q.most_recent_post; 
Смежные вопросы