8791 sujets

Développement web côté serveur, CMS

Bonjour Mesdames et Messieurs,

je viens vers vous pour vous demander de l'aide pour une requête SQL sur laquelle je butte beaucoup!

Je devrais plutôt dire que je cherche une requête qui permet de me dire si une conversation existe déjà, je m'explique.

Voici ma table sachant que je veux satisfaire un relation plusieurs à plusieurs avec une table user et messages.

TABLE MESSAGES


id_message 		int(11) 	
id_conversation 	int(11) 	
id_user 	        int(11) 	
message 	        text 	
date 	                datetime 	


id_message est donc une clé primaire. Normalement id_conversation devrait être une clé étrangère, mais vous comprenez pourquoi pas.

TABLE CONVERSATION


id_conversation 	int(11) 	
id_user 		varchar(255) 	
nouveauMsg 		int(11) 	
nb_user 		int(11) 


Il n'y a aucune clé primaire, mais juste une clé étrangère id_user. Un id_conversation pourra donc être présent plusieurs fois dans la table conversation.

Malheureusement, comme ceci, j'ai beaucoup de mal à demander via une requête si une conversation existe déjà avec les utilisateurs au complet. J'ai pensé à mettre le nombre de personnes dans la conversation, mais je ne sais pas comment faire pour vérifier que lorsque l'on sélectionne une conversation, on ait bien le nombre lignes sélectionnées égale au nombre dans nb_user.

Ça vous paraitra peut être un peu flou. mais comprenez juste cela:

Je cherche à savoir si une conversation existe déjà avec les mêmes personnes et le même nombre (y comprit soi-même). Si j'arrive à résoudre cette énigme, je pourrai enfin finaliser la messagerie de mon site en cours de conception.

Sur cela, je vous souhaite une bonne soirée.
Je vous remercierais beaucoup si vous pouviez m'aider à trouver la solution.

Je vous remercie déjà pour la lecture de ce mail qui je vous l'avoue n'est pas super compréhensible sans connaître entièrement le contexte.

Bref, j'espère avoir été assez clair !

Smiley smile
Modifié par edimitchel (08 Jun 2012 - 17:04)
Modérateur
Bonjour, à mon avis tu as des problèmes de conception, en faisant des relations n-n sans table de liaison… en effet conversation et user sont aussi une relation n-n: un user peut être dans plusieures conversations, une conversation peut avoir plusieurs users

Voilà une structure qui me semble plus solide:

TABLE USER

id_user	clé primaire 
…


TABLE CONVERSATION

id_conversation	clé primaire 
id_createur
…


TABLE USER_CONVERSATION

id_conversation	\
id_user		– Unicité
…


TABLE MESSAGES

id_message 	clé primaire 	
id_conversation	
id_user	
message
date 	
…


Avec cette structure plus solide, l'information que tu cherches est dans la table de liaison USER_CONVERSATION

p.s: Après je suis un bricoleur SQL, des spécialistes auront sûrement des réponses plus précises et exacte
Modifié par kustolovic (08 Jun 2012 - 17:34)
pourquoi pas

ou

un utilisateur a une ou plusieurs conversations

Une conversation a plusieurs messages

Mais la proposition de kustlovic est mieux

car plusieurs utilisateurs peuvent participer à une/des conversations composées de messages
Merci pour vos réponses! J'ai par surprise remarqué que j'avais déjà trouvé cette architecture. Mais je n'étais pas sûr de moi et j'arrivais très mal à comprendre la différence entre la table conversation et user_conversation sachant qu'elle se ressemble à une clé près.
Bref, j'ai essayé de trouver une solution pour récupérer les personnes d'une conversation et pour vérifier si tel ou tel user était déjà dans une conversation.

J'ai réussi pour la récupération des personnes dans une conversation:

	SELECT 			* 
	FROM 			user 
	NATURAL JOIN 		user_conversation
	NATURAL JOIN 		conversation
	WHERE 			id_conversation = ?;


Mais pour la suivante, j'ai vraiment eu du mal !


	SELECT			id_user,id_conversation
	FROM			user
	NATURAL JOIN 		user_conversation
	WHERE 			id_user = ?
	OR			id_user = ?
	OR			id_user = ?
	OR			id_user = ?;


Ce code est complètement INUTILE, je suis tout à fait conscient. J'avais pensé qu'un HAVING ferrai l'affaire, mais finalement, j'ai vite laissé tombé.

Bref, j'aimerai bien avoir la solution pour finaliser ce système de messagerie à plusieurs personnes. Smiley cligne
Salut,

Un petit accouplement entre papa requête et maman requête:


SELECT id_user
FROM	user
WHERE id_user IN (SELECT user_id
	FROM conversation
	WHERE id_conversation = ?);


Évite les natural join, peu d’intérêt et beaucoup de risques ^^
Modifié par JJK801 (08 Jun 2012 - 21:02)