PHP MYSQL Форум тизер, как? - PullRequest
0 голосов
/ 16 мая 2011

Мне нравится делать тизер форума для моего сайта.Легко просто показать последние сообщения или темы. Мне нравится получать последние темы и сообщения в одном запросе, упорядоченные по последним действиям.Таким образом, он будет упорядочен по дате 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

КАК МОЖНО СДЕЛАТЬ ЭТО?

ОБНОВЛЕНИЕ

aaaaaaaaaaaaaaaaawwwww Да !!!!

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

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 ]

0 голосов
/ 16 мая 2011

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
0 голосов
/ 16 мая 2011

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

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

...