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 24/02/2011, 13h19   #1
Membre éclairé
 
Homme
En formation
Inscription : mai 2007
Messages : 127
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : En formation

Informations forums :
Inscription : mai 2007
Messages : 127
Points : 346
Points : 346
Par défaut Pb de requête ou optimisation du schéma ?

Bonjour,

Un ami veut mettre en place un petit systême de candidature.
Les tables qu'il m'a fournies :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE TABLE IF NOT EXISTS `candidatures` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message` varchar(2000) NOT NULL,
  `email` varchar(60) NOT NULL,
  `ip` varchar(15) NOT NULL,
  `date` datetime NOT NULL,
  `login` varchar(50) NOT NULL,
  `traite` tinyint(1) NOT NULL DEFAULT '0',
  `resultat` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
 
CREATE TABLE IF NOT EXISTS `candidatures_votes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `idmembre` int(6) NOT NULL,
  `id_candidature` int(5) NOT NULL,
  `vote` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Pas de souci pour afficher les résultats des candidatures où l'on n'a déjà voté :

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
SELECT
    t.id,
    t.date,
    t.message,
    t.traite,
    t.resultat,
    t.login,
    p.idmembre,
    p.id_candidature,
    p.vote
FROM
    candidatures AS t
JOIN
    candidatures_votes AS p
ON
    t.id = p.id_candidature
WHERE
    t.date > DATE_ADD(NOW(), INTERVAL -2 DAY)
AND
    t.traite = 0
AND
    p.idmembre = id_session
GROUP BY
    t.id
ORDER BY
    t.date ASC

Par contre pour afficher les candidatures ou l'on n'a pas encore voté j'ai essayé ça :

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
SELECT
    t.id,
    t.date,
    t.message,
    t.traite,
    t.resultat,
    t.login,
    p.idmembre,
    p.id_candidature,
    p.vote
FROM
    candidatures AS t
JOIN
    candidatures_votes AS p
ON
    t.id = p.id_candidature
WHERE
    t.date > DATE_ADD(NOW(), INTERVAL -2 DAY)
AND
    t.traite = 0
AND
    p.idmembre != id_session
GROUP BY
    t.id
ORDER BY
    t.date ASC
Mais évidemment ça ne fonctionne pas car il n'y a pas d'enfants dans la table candidatures_votes pour les candidatures où personne n'a encore voté et j'avoue que je tourne un peu en rond

-> Est-il possible en une seule requête d'afficher les candidatures ou l'on n'a pas encore voté ?
-> N'aurait-il pas été préférable créer une 3ème table "votes" et modifier la table candidatures_votes pour en faire uniquement une table de jointure ?

Par avance merci.
nu_tango est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 13h26   #2
Membre Expert
 
Avatar de jbrasselet
 
Homme Julien Brasselet
Ingénieur développement logiciels
Inscription : mars 2006
Messages : 952
Détails du profil
Informations personnelles :
Nom : Homme Julien Brasselet
Âge : 32
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2006
Messages : 952
Points : 1 382
Points : 1 382
Envoyer un message via MSN à jbrasselet
Tu peux le faire en recherchant toutes les candidatures pour lesquels il n'y a pas de lignes dans candidatures_votes.
Pour cela, regarde du coté du not exists
__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
jbrasselet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 13h38   #3
Membre éclairé
 
Homme
En formation
Inscription : mai 2007
Messages : 127
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : En formation

Informations forums :
Inscription : mai 2007
Messages : 127
Points : 346
Points : 346
Merci pour ta réponse jbrasselet,

EXISTS et NOT EXISTS dans mes souvenirs c'est en effectuant une sous-requête qu'on les utilise ?

Je vais regarder de ce côté.
nu_tango est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 13h39   #4
Membre Expert
 
Avatar de jbrasselet
 
Homme Julien Brasselet
Ingénieur développement logiciels
Inscription : mars 2006
Messages : 952
Détails du profil
Informations personnelles :
Nom : Homme Julien Brasselet
Âge : 32
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2006
Messages : 952
Points : 1 382
Points : 1 382
Envoyer un message via MSN à jbrasselet
C'est en effet avec une sous-requête
__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
jbrasselet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 14h19   #5
Membre éclairé
 
Homme
En formation
Inscription : mai 2007
Messages : 127
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : En formation

Informations forums :
Inscription : mai 2007
Messages : 127
Points : 346
Points : 346
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
	t.id, 
	t.date, 
	t.message, 
	t.traite, 
	t.resultat, 
	t.login
FROM
    candidatures AS t
WHERE
    NOT EXISTS(
		SELECT  
			p.id_candidature
		FROM 
			candidatures_votes AS p	
		WHERE
			t.id = p.id_candidature)
AND
    t.traite = 0	
ORDER BY
    t.date ASC
Merci encore pour ton aide, je suis sur la voix, mais cette requête me renvoit toutes les candidatures où personne n'a encore voté et non pas celle ou moi je n'ai pas voté, donc je suis pas encore bon là...

Il faut donc que je fasse intervenir le champ idmembre mais je n'ai pas de sous-ensemble si je fais le fais intervenir dans la clause WHERE de la sous-requête. A moins de faire une jointure dans celle-ci ?
nu_tango est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 15h01   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 993
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 993
Points : 18 246
Points : 18 246
Envoyer un message via MSN à CinePhil
Ajoute la restriction à ton idmembre dans la sous-requête.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SELECT 
    t.id, 
    t.date, 
    t.message, 
    t.traite, 
    t.resultat, 
    t.login
FROM
    candidatures AS t
WHERE
    NOT EXISTS(
        SELECT * -- Inutile de préciser des colonnes ici
        FROM 
            candidatures_votes AS p    
        WHERE
            t.id = p.id_candidature
            AND p.idmembre = 12
    )
    AND t.traite = 0    
ORDER BY
    t.date ASC
Traduction de la requête :
"Sélectionner les candidatures pour lesquelles il n'existe pas de ligne dans la table des votes du membre 12 pour ces candidats "

C'est ce que tu veux ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 15h36   #7
Membre éclairé
 
Homme
En formation
Inscription : mai 2007
Messages : 127
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : En formation

Informations forums :
Inscription : mai 2007
Messages : 127
Points : 346
Points : 346
Merci CinePhil,

je me suis embrouillé tout seul à force de chercher compliqué.
C'est bien cette requête dont mon ami a besoin.
nu_tango est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 16h02   #8
Membre Expert
 
Avatar de jbrasselet
 
Homme Julien Brasselet
Ingénieur développement logiciels
Inscription : mars 2006
Messages : 952
Détails du profil
Informations personnelles :
Nom : Homme Julien Brasselet
Âge : 32
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2006
Messages : 952
Points : 1 382
Points : 1 382
Envoyer un message via MSN à jbrasselet
Dans ta sous-requete tu peux même faire un select 'X' comme ça tu ne parcourt pas les colonnes et tu optimise un brin tes performances.
__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
jbrasselet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 16h55   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 993
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 993
Points : 18 246
Points : 18 246
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par jbrasselet Voir le message
Dans ta sous-requete tu peux même faire un select 'X' comme ça tu ne parcourt pas les colonnes et tu optimise un brin tes performances.
SELECT * va très bien. Dans ce cas, le SGBD ne cherche pas à ramener toutes les colonnes dans la sous-requête, il cherche seulement une ligne qui répond à la condition.

[NOT] EXISTS est même le seul cas où on peut écrire SELECT * sans craindre de déclencher la guerre des étoiles !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/02/2011, 17h08   #10
Membre Expert
 
Avatar de jbrasselet
 
Homme Julien Brasselet
Ingénieur développement logiciels
Inscription : mars 2006
Messages : 952
Détails du profil
Informations personnelles :
Nom : Homme Julien Brasselet
Âge : 32
Localisation : France, Ille et Vilaine (Bretagne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2006
Messages : 952
Points : 1 382
Points : 1 382
Envoyer un message via MSN à jbrasselet
OK, je ne savais pas.
Merci de la précision
__________________
L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai.
jbrasselet est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 18h17   #11
Membre éclairé
 
Homme
En formation
Inscription : mai 2007
Messages : 127
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : En formation

Informations forums :
Inscription : mai 2007
Messages : 127
Points : 346
Points : 346
Merci encore pour ces précisions. A priori je pensais aussi que le SELECT * renverrait toutes les colonnes...

C'est normalisé au niveau des différents SGBDR ça ?
nu_tango est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 18h46   #12
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avec une jointure externe vous couvrez tous vos besoins avec une seule requête.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 00h25   #13
Membre éclairé
 
Homme
En formation
Inscription : mai 2007
Messages : 127
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : En formation

Informations forums :
Inscription : mai 2007
Messages : 127
Points : 346
Points : 346
J'avais pensé aussi à faire un OUTER JOIN mais je n'ai pas réussi à trouver la bonne requête, je vais regarder à nouveau de ce côté mais le gain en performance doit être limité, non ?
nu_tango est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2011, 02h56   #14
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Tout-à-fait, en terme de performances ça devrait être extrêmement proche.
L'avantage c'est que la même requête répond à vos deux besoins :
  • les candidatures où l'on a déjà voté
  • les candidatures ou l'on n'a pas encore voté
__________________
Email : http://scr.im/waldar
Waldar 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 16h36.


 
 
 
 
Partenaires

Hébergement Web