2010-07-31 6 views
0

Débutant question:Comment limiter les résultats de la requête Mysql

J'ai une table de message électronique qui a un champ message_id (champ clé primaire) et d'autres domaines tels que le corps, receiver_id, sender_id et id_parent. Le champ parent_id est ce qui relie les messages du même thread lorsque l'utilisateur répond à un message.

En ce moment j'ai une requête simple qui recherche tous les messages sous un reciever_id spécifique et les renvoie. Le problème est que je veux aussi vérifier si 2 messages ou plus ont le même parent_id et si c'est le cas, je veux seulement le message le plus récent retourné.

Quelqu'un peut-il nous éclairer à ce sujet? J'ai pensé à l'utilisation d'une déclaration CASE, mais je ne savais pas par où commencer.

Répondre

1

Je voudrais ajouter un horodatage au champ pour le moment où il a été soumis. Vous pouvez les utiliser quelque chose de semblable à ce qui suit:

SELECT body, receiver_id, sender_id, parent_id 
FROM messages 
GROUP BY parent_id 
ORDER BY timestamp DESC 
LIMIT 1 

Note: aucun moyen de savoir si pleinement cette requête fonctionne sans l'essayer sur votre table, mais nous espérons qu'il vous points dans la bonne direction.

Editer: @liysd fait un bon point, la commande par va fusionner. Vous devrez faire une sous-requête contre soi-même.

SELECT * 
FROM (SELECT * FROM messages WHERE parent_id = id) 
ORDER BY timestamp DESC 
LIMIT 1 
+0

cela semble aussi que cela devrait fonctionner, mais ne fonctionne pas depuis certaines de mes valeurs NULL sont PARENT_ID. désolé, j'aurais dû le mentionner dès le départ. – queryne

+0

Cela ne fonctionne pas même s'il n'y a pas de null. Les champs corps, récepteur etc. peuvent provenir de n'importe quel enregistrement non nécessaire d'un enregistrement avec le plus grand horodatage. – liysd

+0

Je ne pense pas que cela soit important si vos ID parents sont NULL, vous ne pouvez faire correspondre les valeurs NULL à eux-mêmes (par exemple, vous ne pouvez pas faire correspondre une valeur de l'un des autres ID parents avec une valeur null). Vous ne pourrez faire des correspondances qu'à partir d'enregistrements avec des valeurs parent_id renseignées. – John

0

Vous pouvez utiliser requête imbriquée comme ci-dessous:

select * 
    from messages A 
    where A.receiver_id=:receiver_id 
    (and timestamp = (select max(timestamp) 
        from message B 
        where A.parent_id = B.parent_id and A.parent_id<>NULL)) 
    or A.parent_id = NULL 
+0

ne semble pas fonctionner pour moi. mais avez-vous voulu mettre le ":" entre "A.receiver_id =" ET "receiver_id". – queryne

+0

Je voulais dire un paramètre: receiver_id. Vous pouvez lier la valeur avec la fonction use bindValue. Au lieu de cela, vous pouvez aussi écrire $ receiver_id de PHP ou @receiver_id s'il s'agit d'une partie de la procédure stockée. – liysd

Questions connexes