2016-09-07 3 views
0

Итак, у меня есть одна таблицы, Темывытягивать темы форума в порядке последнего сообщения

ThreadNumber | Sticky | Title 
1   | 1  | Read This Before Posting! 
2   | 0  | Second Topic 
3   | 0  | Check This  

И второй стол, Сообщений

ThreadNumber | Author | Timestamp | Body      | PostNumber 
1   | User1 | 1   | Read up!     | 0 
1   | User2 | 2   | I see.      | 1 
2   | User2 | 3   | So tell me what'chu want! | 0 
3   | User3 | 5   | Yeah, check this out.  | 0 
2   | User3 | 7   | What'chu really really want!| 1 
2   | User1 | 10  | I'll tell you what I want! | 2 

(Отметка в сообщениях есть десять -digit второе целочисленное представление времени, которое функция PHP time() выдает, когда данный пользователь отправляет свой комментарий в db.) Итак, когда дело доходит до отображения всех тем темы форума на f обзорную страницу обзора, то, что я хотел бы сделать, представляет все потоки в порядке их опубликования последнего комментария. Я пробовал свои силы во вложенных MySQL-запросах (не получилось), поэтому я начал делать некоторые исследования. Ничто другое, что я нашел, не могло заставить меня искать то, что я искал. Мне кажется, что this подошел близко, но я все еще получил все результаты, полученные уникальными ThreadNumbers. В идеале, я хотел бы получить вернулся что-то вроде:

ThreadNumber | Title      | LastTimestamp 
2   | Second Topic    | 10 
3   | Check This    | 5 
1   | Read This Before Posting! | 1 

Спасибо за тонну для чтения этого и любых возможных [и многое требуется] помощь!

Я попытался

SELECT PostNumber, ThreadNumber, Body, Author, Timestamp 
FROM (SELECT PostNumber, ThreadNumber, Body, Author, Timestamp 
     FROM Posts 
     ORDER BY Timestamp DESC) AS p 
GROUP BY ThreadNumber; 

, которые не только не вернулся бы, что я на самом деле хотел, но не работает так, как я намеревался в любом случае.

+0

Можете ли вы обновить свой вопрос с помощью запроса, который вы уже пробовали? – Maximus2012

+0

Добавьте поле 'last_post_id' в таблицу' threads'. – zerkms

+0

@ Maximus2012 Добавлено. –

ответ

0

Вы можете сделать это в одном запросе на следующий пример

select 
    Posts.ThreadNumber, 
    Title, 
    max(Timestamp) 
from Threads 
left join Posts on Threads.ThreadNumber = Posts.ThreadNumber 
group by Posts.ThreadNumber, Title 
order by max(timestamp) desc; 

С исходными данными, как

mysql> select * from Posts; 
+--------------+--------+-----------+------+------------+ 
| ThreadNumber | Author | Timestamp | Body | PostNumber | 
+--------------+--------+-----------+------+------------+ 
|   1 | User1 |  20 |  |   0 | 
|   2 | User1 |  30 |  |   0 | 
|   3 | User1 |  10 |  |   0 | 
|   1 | User1 |  24 |  |   0 | 
|   2 | User1 |   2 |  |   0 | 
|   3 | User1 |  200 |  |   0 | 
+--------------+--------+-----------+------+------------+ 
6 rows in set (0,00 sec) 

и

mysql> select * from Threads; 
+--------------+--------+----------+ 
| ThreadNumber | Sticky | Title | 
+--------------+--------+----------+ 
|   1 |  0 | Thread 1 | 
|   2 |  0 | Thread 2 | 
|   3 |  0 | Thread 3 | 
+--------------+--------+----------+ 
3 rows in set (0,00 sec) 

выход будет Вам следующие

mysql> select distinct Posts.ThreadNumber, Title, max(Timestamp) from Threads left join Posts on Threads.ThreadNumber = Posts.ThreadNumber group by Posts.ThreadNumber, Title order by max(timestamp) desc; 
+--------------+----------+----------------+ 
| ThreadNumber | Title | max(Timestamp) | 
+--------------+----------+----------------+ 
|   3 | Thread 3 |   200 | 
|   2 | Thread 2 |    30 | 
|   1 | Thread 1 |    24 | 
+--------------+----------+----------------+ 
3 rows in set (0,00 sec) 

Но в вашем случае я буду перестраивать структуру базы данных. У вас есть очень плохие проблемы в вашей структуре. По крайней мере, вы можете добавить поле id в сообщениях. Пока вы не можете установить в нем действительный индекс, и ваши запросы будут медленнее с большими данными.

+0

Зачем вам «отличиться» здесь? – zerkms

+0

Да, на самом деле здесь нет никакого смысла. – Spell

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