2011-05-16 3 views
0

J'aime faire un teaser de forum pour mon site Web. Il est facile de montrer juste les derniers messages ou discussions. J'aime obtenir les derniers sujets et messages dans la même requête, classés par la dernière activité. Donc, il va être ordonné par la date REPLY TO POST, et la date de publication dans la même requête. Je pense qu'il a un peu à faire avec la façon dont vous le GROUPER, mais je ne suis pas sûr.PHP MYSQL Forum teaser, comment?

Tableaux

fils

id, header, text, date, author 

messages

id, text, date, author, thread_id 

Exemple d'utilisation

20 minutes ago - Comment faire un php/script mysql (2)

17 minutes ago - Pls me aider ici (0)

il y a 1 heure - je besoin d'aide avec PHP (1)

Comme vous le voyez, les deux threads répondus et les nouveaux threads sont dans la liste. (J'ai besoin d'une date de la dernière réponse ou quand il a été créé, en-tête et un nombre() de replys)

J'espère que vous obtenez, et je sais comment faire.

Troels

MISE À JOUR:

J'ai cela, et son accord, mais je ne reçois que les discussions avec replys.

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 

COMMENT PUIS-JE FAIRE?

MISE À JOUR

aaaaaaaaaaaaaaaaawwwww Ouais !!!!

J'ai réussi à le faire moi-même :-) Ça a pris du temps pour bien faire les choses.

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 
+0

Avez-vous développé le logiciel forum vous? La structure de la base de données semble défectueuse, la «publication d'origine» dans un thread doit également figurer dans la table ** posts **. Cela rendra également votre requête plus facile. – Stijn

+0

Salut.Oui, je l'ai développé moi-même. Et les messages originaux devraient être là pour. – Holsteinkaa

+0

Sans vérifier votre requête entière, vous avez une faute de frappe sur la 4ème ligne. ** (SELECT date ** devrait être ** (SELECT date ** – Stijn

Répondre

0

Si vous souhaitez conserver la structure de base de données actuelle, vous aurez besoin d'une union pour obtenir le résultat souhaité. Un exemple peut être trouvé à http://www.mysqltutorial.org/sql-union-mysql.aspx

Cependant, je conseillerais toujours de changer la structure comme expliqué dans les commentaires à votre question. Les clauses

0

WHERE ne sélectionnent que les threads avec des réponses, ce qui est normal. Vous devez utiliser la syntaxe LEFT JOIN.

Essayez ceci:

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

Eh bien, il ne semble pas fonctionner J'ai besoin de la date du fil d'origine aussi, si ce n'est pas des replys. – Holsteinkaa