PHP MYSQL Форум тизер, как?

Мне нравится делать тизер форума для моего сайта. Легко просто показывать последние сообщения или темы. Мне нравится получать последние темы и сообщения в одном запросе, упорядоченные по последним действиям. Таким образом, он будет упорядочен по дате REPLY TO POST и дате THREAD POST в том же запросе. Я думаю, что это имеет какое-то отношение к тому, как вы это делаете, но я не уверен.

таблицы

потоки

id, header, text, date, author

сообщений

id, text, date, author, thread_id

Пример использования

20 минут назад - Как сделать скрипт php/mysql (2)

17 минут назад - пожалуйста, помогите мне здесь (0)

1 час назад - мне нужна помощь с PHP (1)

Как видите, в списке есть как отвеченные, так и новые темы. (Мне нужна дата последнего ответа или когда он был создан, заголовок и количество () ответов)

Я надеюсь, что вы получите, и знаете, как это сделать.

Troels

ОБНОВИТЬ:

У меня есть это, и это нормально, но я получаю только темы с ответами.

SELECT 
    threads.*, 
    posts.*, 
    (SELECT date FROM posts WHERE thread_id = threads.id ORDER BY date DESC LIMIT 0,1) AS postdate, 
    (SELECT count(id) FROM threads WHERE thread_id = thread.id) AS replys 
FROM 
    threads, 
    posts 
WHERE 
    threads.id = posts.thread_id
GROUP BY 
    thread_id
ORDER BY 
    postdate DESC, 
    thread.date 
LIMIT 
    0,15

КАК Я МОГУ ЭТО СДЕЛАТЬ?

ОБНОВИТЬ

ааааааааааааааааааааааааааааа!!!!

Мне удалось сделать это самому:-) Потребовалось время, чтобы сделать это правильно.

SELECT 
    fisk_debat.id, 
    fisk_debat.dato,
    IF((SELECT count(id) FROM fisk_debat_svar WHERE debatid = fisk_debat.id) < 1, fisk_debat.dato, (SELECT dato FROM fisk_debat_svar WHERE debatid = fisk_debat.id ORDER BY dato DESC LIMIT 0,1)) AS svardato,
    fisk_debat.overskrift,
    (
    SELECT count(fisk_debat_svar.debatid) 
    FROM fisk_debat_svar 
    WHERE fisk_debat_svar.debatid = fisk_debat.id
    ) AS svar

FROM  fisk_debat
GROUP BY  id
UNION
SELECT
    fisk_debat_svar.debatid AS id, 
    max(fisk_debat_svar.dato) AS dato,
    max(fisk_debat_svar.dato) AS svardato,
    (
    SELECT fisk_debat.overskrift 
    FROM fisk_debat 
    WHERE fisk_debat.id = fisk_debat_svar.debatid
    ) AS overskrift,
    (
    SELECT count(fisk_debat_svar.debatid) 
    FROM fisk_debat_svar 
    WHERE fisk_debat_svar.debatid = id
    ) AS svar

FROM fisk_debat_svar
WHERE id != id
GROUP BY id

ORDER BY svardato DESC, dato DESC
LIMIT 0,15

2 ответа

Если вы хотите сохранить текущую структуру БД, вам понадобится объединение, чтобы получить желаемый результат. Пример можно найти по адресу http://www.mysqltutorial.org/sql-union-mysql.aspx

Тем не менее, я бы посоветовал изменить структуру, как описано в комментариях к вашему вопросу.

WHERE пункты только выбирают темы с ответами, что нормально. Вы должны использовать LEFT JOIN синтаксис.

Попробуй это:

SELECT 
    threads.*, 
    posts.*, 
    (SELECT date FROM posts WHERE thread_id = threads.id ORDER BY date DESC LIMIT 0,1) AS postdate, 
    (SELECT count(id) FROM threads WHERE thread_id = thread.id) AS replys 
FROM 
    threads
LEFT JOIN
    posts
ON
    threads.id = posts.thread_id
ORDER BY 
    postdate DESC, 
    thread.date 
LIMIT 
    0,15
Другие вопросы по тегам