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 12/07/2011, 09h27   #1
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 21
Points : 5
Points : 5
Par défaut jointure et sous-requetes ?

Bonjour,
j'ai 3 tables que je veux lier par une requête:
La relation de la première aux 2 suivantes est de 0 à N.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
-- Structure de la table `praticiens`
--
 
CREATE TABLE IF NOT EXISTS `praticiens` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `pseudo` varchar(50) NOT NULL,
  `password` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  `titre` smallint(6) NOT NULL DEFAULT '0',
  `prenom` varchar(75) NOT NULL,
  `nom` varchar(75) NOT NULL,
  `birth_date` date NOT NULL,
  `store_date` datetime NOT NULL,
  `IP_ad` varchar(15) DEFAULT NULL,
  `visible` int(11) NOT NULL DEFAULT '0',
  `prat_mod` tinyint(1) NOT NULL DEFAULT '1',
  `level` int(11) NOT NULL DEFAULT '1',
  PRIMARY KEY  (`Id`),
  UNIQUE KEY `email` (`email`),
  UNIQUE KEY `pseudo` (`pseudo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=15 
;
-- Structure de la table `praticiens_cabs`
--
 
CREATE TABLE IF NOT EXISTS `praticiens_cabs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_praticien` int(11) NOT NULL,
  `id_profession` int(11) NOT NULL DEFAULT '1',
  `year_ins` year(4) NOT NULL,
  `cab_valide` tinyint(1) NOT NULL DEFAULT '0',
  `cab_principal` tinyint(1) NOT NULL DEFAULT '1',
  `add1` varchar(255) NOT NULL,
  `add2` varchar(255) DEFAULT NULL,
  `code_postal` varchar(5) NOT NULL,
  `ville` varchar(100) NOT NULL,
  `pays` varchar(2) NOT NULL DEFAULT 'FR',
  `tel` varchar(20) DEFAULT NULL,
  `mobile` varchar(20) DEFAULT NULL,
  `cab_lat` float DEFAULT NULL,
  `cab_long` float DEFAULT NULL,
  `file_id` varchar(255) DEFAULT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `prat_prof` (`id_praticien`,`id_profession`,`cab_principal`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
-- Structure de la table `praticiens_courses`
--
 
CREATE TABLE IF NOT EXISTS `praticiens_courses` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `id_praticien` int(11) NOT NULL,
  `id_course` int(11) NOT NULL,
  `id_organisme` int(11) NOT NULL,
  `year_course` year(4) NOT NULL,
  `course_valid` tinyint(1) NOT NULL DEFAULT '0',
  `filename` varchar(255) DEFAULT NULL,
  `file_Id` varchar(255) DEFAULT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `course_single` (`id_praticien`,`id_course`,`year_course`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=14 ;
Est-il possible de sortir les noms de la première avec un sum ou count ? des enregistrements des 2 autres où l'Id_praticien = Id de praticiens ?
somasimple est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 09h37   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 437
Points : 6 437
Bonjour,

Je ne suis pas bien certain d'avoir compris ce que tu souhaites faire, mais s'il s'agit juste de compter le nombre de "cabs" ou de "courses" d'un praticien, la requête suivante devrait suffire :
Code :
1
2
3
4
SELECT p.nom, COUNT(*) AS nb_cabs
FROM praticiens p
INNER JOIN praticiens_cabs pc ON p.id = pc.id_praticien
GROUP BY p.nom
C'est pareil pour "courses".

Sinon, donne-nous un exemple de ce que tu souhaites obtenir comme résultat à partir des données présentes dans les tables.
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/07/2011, 16h20   #3
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 21
Points : 5
Points : 5
Merci.
En fait je cherche par une requête à savoir si les enregistrements de la table courses ou/et cabs sont tous validés ou pas.
Je pensais faire un COUNT des deux tables et, à la fois un SUM des champs valides cab_valide et course_valid. Normalement si tous les enregistrements sont validés dans les deux tables, je dois avoir COUNT (courses + cabs) = SUM (valides courses + cabs).

Je ne suis pas sûr d'être clair.
somasimple est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 04h48   #4
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 853
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : avril 2011
Messages : 853
Points : 1 332
Points : 1 332
salut,

un truc tout bête du genre:
Code sql :
1
2
SELECT IF(count(*)=(SELECT count(*) FROM `praticiens_cabs` WHERE `cab_valide`>0),"cabs validés","certains cabs non validés")
FROM `praticiens_cabs`

ou encore ce que tu proposes qui doit être plus rapide logiquement :
Code sql :
1
2
SELECT  IF(count(*)=sum(`cab_valide`),"cabs validés","certains cabs non validés")
FROM `praticiens_cabs`

même combat bien sur pour l'autre table... à toi d'adapter les valeurs à retourner avec ou sans if selon ce qui va être traité derrière...

__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 06h08   #5
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 21
Points : 5
Points : 5
Merci pour ces réponses.
Je vais les tester (je suppose qu'il faut quand même la clause WHERE dans les deux derniers exemples).
somasimple est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 07h43   #6
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 21
Points : 5
Points : 5
La solution est la suivante :
Code :
1
2
3
4
5
6
SELECT praticiens.nom, (COUNT( * ) = SUM( praticiens_cabs.cab_valide )) AS cab_valides,
(COUNT( * ) = SUM( praticiens_courses.course_valid )) AS courses_valides
FROM praticiens
LEFT JOIN praticiens_cabs ON praticiens.Id = praticiens_cabs.id_praticien
LEFT JOIN praticiens_courses ON praticiens.Id = praticiens_courses.id_praticien
GROUP BY praticiens.Id
Mais alors que faire avec les résultats NULL ?
Images attachées
Type de fichier : png requete.PNG (15,9 Ko, 6 affichages)
somasimple est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 09h14   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
utilisez le COALESCE ...

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2011, 09h17   #8
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,
Si j'ai bien compris, quand un cab est valide et une course valide ces colonnes prennent la valeur 1 (0 par défaut).
Donc Les NULL correspondent à des praticiens qui soit n'ont pas de cab (2° colonne) soit n'ont pas de course (3°colonne).
Je pense qu'en forçant la valeur de SUM( praticiens_cabs.cab_valide ) et SUM( praticiens_courses.course_valid ) à 0 si NULL, avec COALESCE, cela devrait faire disparaître ces NULL.
Les COUNT(*) seront égaux à 1 (la ligne du praticien), et les SUM() égaux à zéro pour ces lignes, donc leur comparaison devrait retourner FALSE.
__________________
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 13/07/2011, 11h11   #9
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 21
Points : 5
Points : 5
Merci des conseils !

Code :
1
2
3
4
5
6
7
SELECT praticiens.nom, (
COUNT( * ) = COALESCE( SUM( praticiens_cabs.cab_valide ) , 0 ) + ( COUNT( * ) = COALESCE( SUM( praticiens_courses.course_valid ) , 0 ) )
) AS valides
FROM praticiens
LEFT JOIN praticiens_cabs ON praticiens.Id = praticiens_cabs.id_praticien
LEFT JOIN praticiens_courses ON praticiens.Id = praticiens_courses.id_praticien
GROUP BY praticiens.Id
Cela donne les bons résultats.
somasimple est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 07h50   #10
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 21
Points : 5
Points : 5
Je reviens sur cette requête qui logiquement donne un résultat faux !
En effet, si le résultat est 1 dans une table ou l'autre, la somme devient 1.
1+0 =1, 0+1 =1

Faut-il remplacer le + par un AND ?
Images attachées
Type de fichier : png requete2.PNG (3,7 Ko, 2 affichages)
somasimple est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 09h11   #11
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Cela dépend de la table de vérité souhaitée au final ...

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/07/2011, 10h59   #12
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2011
Messages : 21
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Santé

Informations forums :
Inscription : juin 2011
Messages : 21
Points : 5
Points : 5
Bien sur !
Je viens de tester le AND et la table de vérité répond à mes exigences, à savoir ;

1+0=0
0+1=0
0+0=0
1+1=1

l’opérateur + est bien un ET logique.
somasimple 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 06h24.


 
 
 
 
Partenaires

Hébergement Web