2013-11-03 4 views
2

В настоящее время я изо всех сил стараюсь найти правильный запрос о том, чего хочу достичь, и задавался вопросом, есть ли у кого-то яркие идеи. Был утерян здесь уже довольно несколько дней и просто не может найти правильный запрос, чтобы получить то, что мне нужно.MySQL запрос сортировка правильной информации

Желаемый результат:

В настоящее время я полностью работает форум, с несколькими категориями, в связи с тем, что есть несколько категорий, которые я хотел бы сделать страницу обзор в основном о том, последнюю нить, последнее сообщение, по кого и в какое время за категорию.

Вот как моя таблица построена

Имя: Форумы Поля: ID, имя

Имя: forum_threads Поля: идентификатор, F_ID, при условии, автор, lastpost

Имя: forum_posts Поля: идентификатор, t_id, должность, автор, время

Реальная проблема

Я получил запрос до сих пор, что он отображает все, как я хочу, за исключением одного вещь, она не получает последнюю тему темы, все остальное, кажется, отображается правильно (обратите внимание, что я отключил forums.id 9 и все выше 12, я не хочу показывать эти результаты.

SELECT forums.id, t.id AS thread_id, 
    t.subject, 
    t.forum_id, 
    t.author, t.lastpost, 
    u1.name AS author_name, u1.avatar AS author_avatar, 
    u2.name AS lastpost_name, u.avatar AS lastpost_avatar 
    COUNT(p.id) AS postscount, COUNT(DISTINCT (t.id)) AS threadscount, 
    forums.name, 
    max(p.time) last_post_date 
FROM forum_threads t 
INNER JOIN users u1 ON u1.id = t.author 
INNER JOIN users u2 ON u2.id = t.lastpost 
INNER JOIN forum_posts p ON p.t_id = t.id 
INNER JOIN forums ON forums.id = t.forum_id 
WHERE forums.id != 9 AND forums.id > 12 
GROUP BY forums.id 
ORDER BY forums.id ASC, p.id DESC, last_post_date DESC 

У кого-нибудь есть идеи?

ответ

1

Ну, если thread_id вы извлечение правильно, и subject столбца на forum_threads таблице содержит предмет вы ожидаете, то есть проблема в вашем коде уровня отображения, а не запрос. (Так как вы вытаскиваете thread_id из той же строки, что и t.subject, если все верно, как и ожидалось, то и другое должно быть.)

Кроме того, используя конструкции, такие как WHERE forums.id != 9 AND forums.id > 12. Вместо этого у вас должен быть столбец в базе данных для disabled и запрос на это. В противном случае у вас есть бесполезный беспорядок.


В ответ на замечания, попробуйте добавить этот блок SQL для ваших JOIN статей:

INNER JOIN (SELECT t2.forum_id as forum_id, MAX(lastpost) as lastpost 
    FROM forum_threads t2 
    GROUP BY t2.forum_id) as latest_post_per_forum 
    ON latest_post_per_forum.forum_id = t.forum_id 

и это к вашему WHERE статье:

AND t.lastpost = latest_post_per_forum.lastpost 

К сожалению, я не иметь удобный экземпляр MySQL в это время, чтобы проверить мой синтаксис, но суть должна быть очевидной: вытащите последний идентификатор сообщения на основе каждого форума, а затем сравните каждый поток l Ист сообщения об этом.

+0

Ну, thread_id ссылается на тот же поток, что и на тему, только что это не последняя ветка, в которую были отправлены. Цените входные данные в ситуации вне темы, я разрешу это, как только все будет готово , это означает, что некоторые форумы не будут показаны пользователям, которые не вошли в систему. – user2949138

+0

У вас есть несколько вариантов: вы можете фильтровать на стороне приложения, чтобы вы выбрали поток с максимальным значением last_post_date из всего набора результатов (который может стать дорогим, поскольку ваш сайт становится более занятым). Вы также можете добавить подзапрос, который в mysql будет довольно плохим для производительности. Вы также можете выполнить второй запрос на уровне приложения и передать список идентификаторов в слое приложения. Я добавлю пример подзапроса в ответ. – syrion

+1

Спасибо! после игры с тем, что вы опубликовали, мне удалось исправить точный результат, который я хотел, и мне также пришлось сделать отдельное внутреннее соединение для моих целей, но теперь все работает хорошо! Дал бы вам куддо, но для этого нужно больше репутации, поэтому, если кто-то может сделать это от моего имени, пожалуйста, сделайте это для этой легенды =) – user2949138

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