Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/06/2011, 17h44   #1
Invité de passage
 
Homme
Étudiant
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant
Secteur : Arts - Culture

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 1
Points : 1
Par défaut Optimisation et choix de requetes

Bonjour tout le monde,

Je développe actuellement pour un site web un tout petit service de messages privée.

Afin d'identifier l'expediteur et le destinataire de chaque message, j'ai créé dans la table "messages" deux colonnes avec index, référençant l'id des utilisateurs :

"s_id" pour l'expediteur
"r_id" pour le destinataire


Avant l'insertion du message dans la base de données, je dois effectuer deux traitements préalables :

1- L'utilisateur qui envoie le message me fournit son id, le message, le titre, mais le pseudo du destinataire : je dois récupérer son id via la table "users" afin d'effectuer et le deuxième traitement et l'insertion du messages dans la table

2- Je dois compter le nombre de message non lus déjà envoyés par l'utilisateur au destinataire (une limite est imposée)


J'ai donc trouvé deux solutions qui fonctionnent :

Soit deux requêtes distinctes :

Code :
1
2
3
SELECT id 
FROM users 
WHERE username = '$username'
Puis, ayant récupéré l'id du destinataire
Code :
1
2
3
4
5
SELECT COUNT(id) 
FROM messages 
WHERE s_id=$id 
AND r_id=$id_recupere 
AND `read`=0
Soit l'utilisation de sous requêtes :

Code :
1
2
3
4
5
SELECT COUNT(id), (SELECT id FROM users WHERE username = '$username') AS recipient_id
FROM messages 
WHERE s_id=$id
AND r_id=(SELECT id FROM users WHERE username = '$username')  
AND `read`=0
Mais avec mes connaissances en sql je n'ai aucune idée de laquelle est la plus performante et adaptée, voir même si il existe une meilleure méthode, et c'est donc en cela que j'aurai besoin d'un petit éclaircissement ..!

Merci d'avance (:
Acrylique est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 08h55   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Saluton,
Il me vient immédiatement à l'idée la question suivante :
est-ce que la colonne username de la table users est contrainte avec UNIQUE ?
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/06/2011, 15h33   #3
Invité de passage
 
Homme
Étudiant
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant
Secteur : Arts - Culture

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 1
Points : 1
Salut,

Oui elle est contrainte avec UNIQUE
Acrylique est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 06h32   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Alors, j'essayerais ça
Code sql :
1
2
3
4
5
6
7
SELECT u.id, COUNT(*) AS non_lus
FROM users AS u
INNER JOIN messages AS m
ON m.r_id = u.id
    AND m.s_id= $id
WHERE u.username = '$username'  
AND m.`read`=0
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 07h11   #5
Invité de passage
 
Homme
Étudiant
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant
Secteur : Arts - Culture

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 1
Points : 1
Merci !

Votre requête ne correspondait pas exactement à mes besoins, mais elle m'a servi de bonne base pour trouver une requête qui me semble plutôt juste

Code :
1
2
3
4
5
6
SELECT u.id, COUNT(m.id) AS unread
FROM users AS u
LEFT JOIN messages AS m ON m.r_id = u.id
AND m.s_id=$id
AND m.`read`=0
WHERE u.username ='$username'
Acrylique est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 08h20   #6
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 530
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

Informations professionnelles :
Activité : Retraité
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : novembre 2005
Messages : 2 530
Points : 3 523
Points : 3 523
Effectivement, j'avais oublié le cas des primo-déposeurs de message, en tout cas pour un destinataire précis.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 09h01   #7
Invité de passage
 
Homme
Étudiant
Inscription : juin 2011
Messages : 4
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant
Secteur : Arts - Culture

Informations forums :
Inscription : juin 2011
Messages : 4
Points : 1
Points : 1
Aucun problème, l'essentiel était là et m'a bien aidé, merci !
Acrylique est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h01.


 
 
 
 
Partenaires

Hébergement Web