Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 03/11/2011, 04h33   #1
Invité régulier
 
Homme
Développeur Web
Inscription : octobre 2009
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2009
Messages : 9
Points : 5
Points : 5
Par défaut Requête un peu complexe relation n:n MySQL

Bonsoir communauté,

je développe actuellement un annuaire web en php/mysql pour des cafés et restos et j'ai une recherche à mettre en place. J'ai du mal à écrire la requête SQL qui fera le boulot. Je vous explique mon schéma de base de données

etablissement(id,nom,coordonnes,quartier...)
service(id,libelle)
service_etablissement(id_etablissement,id_service)

comme vous pouvez le constater un établissement à plusieurs services genre wifi, payement par carte bancaire, cave à vis, diffusion des matchs de foot, livraison ... donc pour sélectionner un établissement qui se trouve dans tel quartier et équipe du wifi et il diffuse les matchs de foot

sachant que je suis sur Mysql pour le faire j'ai écrit ceci ... (peut-être que c'est une connerie )

Code :
1
2
3
4
5
6
7
8
SELECT * 
FROM etablissement e
INNER JOIN service_etablissement se ON se.id_etablissement = e.id
INNER JOIN service s ON se.id_service = s.id
WHERE quartier = 'Mon_quartier'
AND s.libelle = 'wifi'
AND s.libelle = 'matchs'
...
N.B : on pourrait passer par les ID des services et sans faire appel à la table services ...

je sens que c'est pas très logique mais je vois pas comment m'y prendre ... merci d'avance
simolewestside est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/11/2011, 08h23   #2
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 698
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 698
Points : 839
Points : 839
tu peux utiliser ce modèle de requête provenant d'une discussion précédente.
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/11/2011, 08h27   #3
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 097
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 097
Points : 1 914
Points : 1 914
Bonjour,
Je dirais que le problème vient de là:
Code SQL :
1
2
AND s.libelle = 'wifi'
AND s.libelle = 'matchs'

wifi sera difficilement égal à matchs, sauf peut-être dans la matrice

Je te donne une piste: tu veux les établissements qui ont ces deux services. Donc dans ta requête :
tu renvoies les établissement et le nombre de lignes
dont les services sont dans la liste que tu indiques (wifi,matchs)
et dont le nombre de service correspondant est de 2

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 05/11/2011, 01h40   #4
Invité régulier
 
Homme
Développeur Web
Inscription : octobre 2009
Messages : 9
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : octobre 2009
Messages : 9
Points : 5
Points : 5
Par défaut Merci :)

en fin de compte cela a donné quelque chose comme ceci :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT e.name, q.name,e.budget_moyen, count(se.id_service) AS nbr
FROM etablissements e
JOIN services_etablissements se ON se.id_etablissement = e.id
JOIN quartiers q ON q.id = e.quartier_id
WHERE se.id_service IN (13,12)
AND e.quartier_id = 7
GROUP BY e.id
HAVING count(se.id_service) = (SELECT count(se2.id_service)
                  FROM services_etablissements se2
                  WHERE se2.id_service IN (13,12)
                  GROUP BY se2.id_service 
                  ORDER BY count(se2.id_service) DESC
                  LIMIT 0,1)
ORDER BY nbr
je vous remercie encore une fois ceci ma était très utile
simolewestside 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 12h59.


 
 
 
 
Partenaires

Hébergement Web