2010-11-18 4 views
0

J'ai 2 tables:problème avec MySQL requête

Le tableau de question avec la structure suivante:

id 
title 
userid 
date 

table et réponses avec la structure suivante:

id 
idquestion 
userid 
message 
date 

Je veux montrer toutes les questions et la dernière réponse à cette question.

Par exemple, si nous avons 5 questions, je voudrais faire quelque chose comme ceci:

id title message messagedate 
1  qs 1 mess 1 2010-11-18 
2  qs 2 mess 2 2010-11-19 
3  qs 3 mess 3 2010-11-20 
4  qs 4 mess 4 2010-11-21 

Ma requête à ce jour:

SELECT q.id, qa.id as answerid, title, qa.message 
     FROM `questions` q 
INNER JOIN questions_answers qa 
     ON q.id = qa.idquestion 
    GROUP BY q.id 
    ORDER BY q.id, answerid DESC 

Mais il ne fonctionne pas correctement, il groupes par la question id (en supprimant tous les autres messages des colonnes, en laissant seulement le premier message - donc la commande par est inutile)

Toute aide appréciée. Merci

+0

Pouvez-vous poster quelques exemples de données sur les tables, pour montrer exactement comment vous voulez que la sortie soit générée à partir des données stockées? (Par exemple, il suffit de retirer le «GROUP BY» pour fonctionner maintenant, mais je ne pense pas que ce soit ce que vous voulez) ... – ircmaxell

+0

Si je supprime le groupe, j'obtiendrai toutes les réponses. Par exemple, si j'ai une question avec 2 réponses, j'aurai 2 lignes pour cette question, au lieu d'une. Si j'ai des questions X, je veux obtenir X lignes en faisant la requête, donc seulement la dernière réponse/question, – FinalDestiny

Répondre

2

L'ancien problème. Voici la solution: http://dev.mysql.com/doc/refman/5.1/en/example-maximum-column-group-row.html

Dans votre cas:

SELECT q.id, qa.id as answerid, title, qa.message 
FROM questions q 
JOIN questions_answers qa ON q.id = qa.idquestion 
LEFT JOIN questions_answers qa2 ON qa.idquestion = qa2.idquestion AND qa.date < qa2.date 
WHERE qa2.idquestion IS NULL 

(L'idée est de diviser le problème en deux opérations. Une jointure des questions aux réponses, puis utiliser les méthodes de l'article MySQL)

+0

Je voudrais le faire seulement avec 1 requête, pas de sous-requêtes. – FinalDestiny

+0

Alors peut-être juste utiliser la solution avec le LEFT JOIN !? – AndreKR

+0

J'ai deux tables différentes, pas seulement une comme l'a cet exemple. Donc, je ne peux pas comprendre comment le faire. Pouvez-vous m'aider un peu avec la requête? Merci, – FinalDestiny

0

Eh bien, vous pouvez l'aborder différemment. Vous utilisez une jointure interne, ce qui signifie que vous n'afficherez aucune question sans réponse, alors recherchez la réponse max groupée par l'identifiant de la question, et joignez la table des questions pour obtenir le titre.

SELECT q.id, qa.id as answerid, q.title, qa.message FROM questions q INNER JOIN question_answers qa ON q.id = qa.idquestion AND qa.id IN (SELECT MAX(id) FROM question_answers WHERE idquestion = q.id) GROUP BY q.id ORDER BY q.id DESC

+0

Cela fonctionne très bien pour le qa.id, mais le qa.message est faux, toujours le premier. Par exemple je veux trouver le dernier utilisateur qui a répondu à ce message, le MAX ne fonctionnera pas ici, – FinalDestiny

+0

Non, cela donnera un message arbitraire pour qa.message, pas le plus récent. – AndreKR

+0

J'ai testé et oui, le message a été foiré, il est ici, fonctionnel avec une sous-requête, mais ce n'est pas aussi joli que AndreKR: p –