MySQL Query Design для последних сообщений на форуме - PullRequest
5 голосов
/ 04 июля 2010

у меня есть 3 таблицы

forums_forum

+-----+--------+-------------+-------+-----+
| fid | name   | description | index | cid |
+-----+--------+-------------+-------+-----+
|  36 | gdghdf | hjghj       |    54 |   5 |
|  45 | yutuy  | iuyi        |    99 |   6 |
+-----+--------+-------------+-------+-----+

forums_threads

+----+-----+-----+-------+-------+------+-----------+------+
| id | tid | fid | moved | mfrom | view | important | lock |
+----+-----+-----+-------+-------+------+-----------+------+
|  1 |   4 |  36 |     0 | NULL  |    0 |         0 |    0 |
|  2 |  12 |  36 |     0 | NULL  |    7 |         0 |    0 |
|  3 |   9 |  15 |     0 | NULL  |    0 |         0 |    0 |
+----+-----+-----+-------+-------+------+-----------+------+

forums_posts

+----+-------+--------+--------+---------------------+--------+--------+-----+
| id | title | detail | author | date                | edited | editby | tid |
+----+-------+--------+--------+---------------------+--------+--------+-----+
|  1 | asfsd | sdfsd  |      1 | 2010-07-01 21:31:29 |      0 | NULL   |   4 |
+----+-------+--------+--------+---------------------+--------+--------+-----+

Я пытаюсь создатьзапрос, который возвращает результат -> для каждого уникального 'fid', одной строки из 'forums_posts' (ORDER BY 'date').

forums_forum. fid = forums_threads. fid forums_threads. tid = forums_posts. tid

Спасибо

Ответы [ 3 ]

3 голосов
/ 04 июля 2010

Это почтенная проблема с наибольшим числом групп, которая часто возникает при переполнении стека Вот решение с учетом ваших таблиц:

SELECT p.* FROM forums_posts p JOIN forums_threads t ON p.tid = t.tid
WHERE NOT EXISTS (
    SELECT * FROM forums_posts p2 JOIN forums_threads t2 ON p2.tid = t2.tid
    WHERE t.fid = t2.fid AND p.date < p2.date
);
1 голос
/ 04 июля 2010

Ну, я предлагаю вам присоединиться к вам.

SELECT C.date, C.title, A.name
FROM forums_forum A 
   JOIN forums_threads B ON A.fid=B.fid 
   JOIN forums_posts C ON B.tid=C.tid
ORDER BY C.date DESC LIMIT 1

или .. не проверено:

SELECT MAX(c.date), C.date, C.title, A.name
FROM forums_forum A 
   JOIN forums_threads B ON A.fid=B.fid 
   JOIN forums_posts C ON B.tid=C.tid
LIMIT 1

; -)

p.s. Вы можете столкнуться с проблемами, назвав столбец «date», а также «index» и «view», лучше используйте другие имена.

p.p.s. есть ли fids (я полагаю, это ваш первичный ключ и он должен быть уникальным), который встречается более одного раза?

0 голосов
/ 04 июля 2010

В качестве альтернативы JOIN, вы можете добавить столбец к вашей таблице forums_forums с именем, например last_updated. При каждой публикации в ветке просто запускайте дополнительные UPDATE like.

ОБНОВЛЕНИЕ форумов SET last_updated = NOW ()

Затем, чтобы получить форумы по порядку форумов, ваш SELECT станет намного проще и эффективнее.

ВЫБРАТЬ * ИЗ форумов_форума ЗАКАЗАТЬ по дате последнего обновления DESC

...