2011-04-26 3 views
0

J'écris un script basique en PHP/MySQL mais je suis bloqué à une requête de base de données maintenant. Je vous remercie des conseils ou de l'aide (:Besoin de support pour écrire une requête MySQL

J'utilise deux tables, puisqu'un message peut être envoyé à plusieurs utilisateurs:

messages: 
id | sender_id | subject | ... 

message_receivers: 
message_id | receiver_id | ... 

Ce que je veux faire est maintenant afficher un message à la .. utilisateur qu'il sélectionne Mais je veux montrer l'histoire du message que l'utilisateur avait cette conversation (sauter dans le navigateur pour celui qu'il a choisi) Faire cela avec une jointure est assez simple:

SELECT * FROM messages 
    JOIN message_receivers 
    ON messages.id = message_receivers.message_id 
    WHERE sender_id = x 
    AND receiver_id = y 

Mais maintenant, je Je manque l'information des autres destinataires d'un message! Et je n'ai aucune idée de comment s informations. Des idées pour ça? (:

+0

Veuillez clarifier ce que vous entendez par "omettre les informations des autres destinataires d'un message". Cherchez-vous une requête qui va retourner une conversation entre deux utilisateurs? Il est difficile de voir exactement ce dont vous avez besoin. – Mikecito

+0

Oui, je cherche une requête pour obtenir toute la conversation entre deux utilisateurs (et la déclaration JOIN ci-dessus le fait déjà). Mais le résultat de la requête ne me dira pas si un message dans cette conversation avait aussi d'autres récepteurs! –

Répondre

1

joindre à la table message_receivers une fois de plus pour récupérer les autres destinataires du message:

SELECT 
    m.id, m.sender_id, m.subject, 
    r.receiver_id AS recipient, 
    c.receiver_id AS carboncopy 
FROM messages AS m 
INNER JOIN message_receivers AS r 
    ON m.id = r.message_id 
LEFT OUTER JOIN message_receivers AS c 
    ON r.message_id = c.message_id AND r.receiver_id != c.receiver_id 
WHERE m.sender_id = x AND r.receiver_id = y 

Le destinataire vous êtes intéressé par sera dans la colonne recipient (dans chaque enregistrement de résultat). Les autres destinataires figureront dans la colonne carboncopy (un par enregistrement de résultat). Si carboncopy est NULL, le message ne comportait qu'un seul récepteur.

+0

Merci beaucoup pour la requête et sa description! Exactement ce que j'ai cherché! –

0

Vous les informations manquantes sur d'autres récepteurs du message en raison de la clasue:

AND 
receiver_id = y 

Cela limite le jeu de résultats à tout récepteur y Retirez la clause, et vous les aurez tous. . Cependant, vous aurez probablement chaque message envoyé où sender_id = x ainsi, vous aurez donc besoin de limiter la requête en spécifiant une message_id

ainsi, votre requête finale devrait ressembler à ceci:.

SELECT 
* 
FROM 
messages 
JOIN message_receivers ON messages.id = message_receivers.message_id 
WHERE 
sender_id = x 
AND 
message_id = y 
+0

Si je spécifie un certain message_id dans la clause where je n'attraperai pas toute la conversation): –

+0

@ d.hill Ah, je n'avais pas réalisé que la conversation pouvait être construite de plusieurs messages. Vous feriez mieux d'utiliser deux requêtes ici, vu que vous essayez de trouver deux ensembles d'informations.Essayez d'utiliser une requête pour obtenir la conversation, et une autre pour obtenir les récepteurs. –

+0

Oui, mais pourrais-je écrire cela dans une requête avec plusieurs sélections? Je suis plutôt inexpérimenté dans ce domaine. Ecrire une requête pour chaque message pour vérifier s'il y a d'autres récepteurs serait facile mais beaucoup trop. –

1

Si vous voulez voir tous les récepteurs d'un message puis retirer la deuxième partie de la clause étaient:

AND receiver_id = y 

en même temps, vous voulez préciser le message_id parce que ce sera à confusion pour l'utilisateur sur le frontal

AND message_id = z 
0

Vous n'avez pas besoin de restreindre votre résultat à receiver_id = y, n'est-ce pas? Aussi, vous pouvez écrire la déclaration d'une manière différente et retourner facilement récepteurs ids:

SELECT m.*, r.receiver_id 
FROM messages m, message_receivers r 
WHERE m.id = r.message_id 
AND m.sender_id = x 
Questions connexes