J'ai fait un code pour récupérer une conversation entre 2 membre. je voudrai savoir si elle est optimisé et si elle marche.
J'ai une table conversation avec 2 colonnes id|title et une table connection_conversation avec 2 colonnes id_conversation|id_membre
que vous compreniez bien : J'ai : id_conversation|id_membre 1|1 1|2 2|1 2|3 Si je veux récupérer la conversation entre les membre 1 et 2 je récupéré la conversation n°1. Si je veux récupérer la conversation entre le membre 1 et 3 je récupéré la conversation n° 2. Si je veux récupérer la conversation entre 2 et 3 je veux créer la conversation car elle n'existe pas.
Je récupère d'abord tout les id_conversation en commun entre le membre a qui appartient la session et le membre a qui appartient l'id _GET grace a la ligne (je suis pas sur de cette ligne) :
$req = $db->prepare("SELECT id_conversation FROM connection_conversation WHERE id_conversation = (SELECT id_conversation FROM connection_conversation WHERE id_membre = (:getinfo) INNER JOIN connection_conversation ON connection_conversation.id_membre = (:sessioninfo)) ORDER BY id_conversation");
$req->execute(array(':getinfo' => $_GET['id'], ':sessioninfo' => $_SESSION['id']));
Ensuite je sélectionne l'id_conversation qui se suit 2 fois.
Si elle n'existe pas je la crée.
Est-ce bon ?
Edit :
C'est peut être mieux comme ca
$req = $db->prepare("SELECT id_conversation FROM connection_conversation WHERE id_conversation=(SELECT id_conversation FROM connection_conversation WHERE id_membre = (:sessioninfo)) AND id_membre = (:getinfo) ORDER BY id_conversation");
$req->execute(array(':getinfo' => $_GET['id'], ':sessioninfo' => $_SESSION['id']));
Oui c'est uniquement pour les discutions entre 2 utilisateurs.
Pour récupérer les discutions a plus de 2 utilisateurs je fait une autre fonction de récupération des données.
En fait je liste les amis dans une div. tu peux cliquer sur les amis et ca lance cette fonction (ci dessus). ce qui lance un chat 1v1.
Dans une autre div, je liste les conversations a +de 2 utilisateurs. les conversations de groupe.
Je ne veux pas lister directement les conversations. Je veux lister les amis, puis les conversation de groupe. un peux sur le principe de facebook. Ca me permet de lister les amis pour lequel il ni a pas de conversation déja creer ou les amis pour lesquel il ni a pas de conversation 1v1. Ou encore de lancer une conversation avec des gens qui ne sont pas dans la liste d'ami.
Ma seconde fonction est la bonne. Le code marche. Je suis pas sur qu'il soit optimisé.
Déjà, pour retrouver les conversations entre deux membres données (2 ids), je ferai :
SELECT id_conversation
FROM
connection_conversation C1
INNER JOIN connection_conversation C2
ON C1.id_conversation = C2.id_conversation
WHERE
C1.id_membre = 'id membre connecté'
AND C2.id_membre = 'id membre recherché'
Parce que ca me selectionne les id de conversation en commun.
En gros si le SESSION a 4 conversations en commun avec le GET la 1,2,3,4 ; il va me selectionner 1/2/3/4.
Mais je sais pas laquelle choisir entre toutes ces conversations car moi je veux la seul et unique conversation ou il y a 2 membre, le session et le get.
Si il y a 4 membre dans la 1 ; 2 membre dans la 2 ; 6 membre dans la 3 et 12 membre dans la 4, je veux choisir la 2 car il y a mon session et mon get et qu'elle a une longueur 2.
avec ma requête, je triais par id conversation et du coup j'avais
Parce que ca me selectionne les id de conversation en commun.
En gros si le SESSION a 4 conversations en commun avec le GET la 1,2,3,4 ; il va me selectionner 1/2/3/4.
Oui.
MarcKa a écrit:
Mais je sais pas laquelle choisir entre toutes ces conversations car moi je veux la seule et unique conversation ou il y a 2 membre, le session et le get.
Je n'avais pas compris cette exigences. Par contre selon ton modèle, entre deux membres, et seulement ces deux, il peut y avoir plusieurs conversations ... et d'ailleurs, ton code de départ ne traitait pas non plus ce cas là ...
Pour ne retourner que les conversations exclusivement entre ces deux membres, il faut compter le nombre de participants pour chaque conversation et exclure celles avec plus de deux ... Je ferai ceci :
SELECT C1.id_conversation
FROM
connection_conversation C1
INNER JOIN connection_conversation C2
ON C1.id_conversation = C2.id_conversation
INNER JOIN (
-- Conversation avec exactement 2 participants
SELECT id_conversation
FROM connection_conversation
GROUP BY id_conversation
HAVING COUNT(*) = 2
) C3
ON C1.id_conversation = C3.id_conversation
WHERE
C1.id_membre = 'id membre connecté'
AND C2.id_membre = 'id membre recherché'
Tu peux aussi envisager une solution avec jointure externe :
SELECT C1.id_conversation
FROM
connection_conversation C1
INNER JOIN connection_conversation C2
ON C1.id_conversation = C2.id_conversation
LEFT JOIN connection_conversation C3
ON C2.id_conversation = C3.id_conversation
AND C3.id_membre <> 'id membre connecté'
AND C3.id_membre <> 'id membre recherché'
WHERE
C1.id_membre = 'id membre connecté'
AND C2.id_membre = 'id membre recherché'
AND C3.id_conversation IS NULL
Ce sera peut-être un poil plus lent, mais le résultat devrait être identique.
Merci pour tout ce que tu me montre. c'est cool d'avoir appris a utiliser Group By et Having.
du coup ca ne marcherai pas ca :
$req = $db->prepare("SELECT id_conversation FROM connection_conversation WHERE id_conversation = (SELECT c1.id_conversation FROM connection_conversation AS c1 INNER JOIN connection_conversation AS c2 ON c1.id_conversation = c2.id_conversation WHERE c1.id_membre = (:sessioninfo) AND c2.id_membre = (:getinfo) ) GROUP BY id_conversation HAVING COUNT(*) = 2");
Sur mon test ca marche... j'ai qu'une conversation en commun entre mon get et mon session. Donc je suis pas sur que si yen a plusieurs ca marche. J'ai vu que pour utiliser plusieur or il fallait utiliser IN. Peut être que pour utiliser plusieur AND il y a un opérateur. Ou peut être pas au quel cas ma requète est fonctionnel.
J'ai peur que tas première requête soit trop longue si il y a des millier de conversation de longueur 2.
Tas seconde requête a l'air pas mal mais je la trouve pas très graphique.
Si la mienne marche c'est cool. Sinon peut être qu'il y a un opérateur comme IN pour OR, pour AND.
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
"Etre vrai, peu le peuvent."
Friedrich Nietzsche
"Etre vrai, peu le peuvent."
Friedrich Nietzsche
"Etre vrai, peu le peuvent."
Friedrich Nietzsche
"Etre vrai, peu le peuvent."
Friedrich Nietzsche
"Etre vrai, peu le peuvent."
Friedrich Nietzsche
"Etre vrai, peu le peuvent."
Friedrich Nietzsche