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 18/12/2011, 17h55   #1
Membre du Club
 
Homme Bastien Sevajol
Développeur Web
Inscription : mars 2007
Messages : 152
Détails du profil
Informations personnelles :
Nom : Homme Bastien Sevajol
Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2007
Messages : 152
Points : 56
Points : 56
Envoyer un message via MSN à buxbux Envoyer un message via Skype™ à buxbux
Par défaut Compréhension SQL : jointures et "doublons"

Bonjour,

Je développe dans le web depuis plusieurs année et me sert du langage SQL régulièrement. J'ai cependant très souvent utilisé les SGBDR de manière simple sans vraiment optimiser au mieux mes requêtes. Celà a cause de mon manque de connaissance dans l'usage avancé des SGBDR.

Aujourd'hui j'aimerais me débloquer sur la notion que je vais présenter ci-dessous.

Contexte: Trois table:
Code :
1
2
3
4
 
element:      [id, name]
elements_tag: [id, element_id, tag_id]
tag:          [id, name]
Lorsque j'effectue cette requête,
Code :
1
2
3
4
5
6
7
 
SELECT e.id AS eid, e.name AS ename, t.name AS tname
FROM element e
LEFT JOIN elements_tag et
  ON e.id = et.element_id 
LEFT JOIN tag t
  ON t.id = et.tag_id
disons que mon retour est:

Code :
1
2
3
4
5
6
7
8
eid    ename    tname
1    voiture    deplacer
1    voiture    moteur
2    velo       deplacer
3    porte      ouvrir
3    porte      bois
4    bureau      poser
4    bureau      bois
J'ai bien mes éléments et les tags qui y sont associés. Avec ça je peux hydrater mes objets dans mon programmes.

Ma question désormais est comment puis-je limiter ma requête a un certains nombre d’éléments et non a un certains nombre de résultats.
Si je rajoute une LIMIT a ma requête:

Code :
1
2
3
4
5
6
7
8
 
SELECT e.id AS eid, e.name AS ename, t.name AS tname
FROM element e
LEFT JOIN elements_tag et
  ON e.id = et.element_id 
LEFT JOIN tag t
  ON t.id = et.tag_id
LIMIT 3
Je limite mon nombre de résultats:

Code :
1
2
3
4
eid    ename    tname
1    voiture    deplacer
1    voiture    moteur
2    velo       deplacer
Or mon souhait est de limiter le nombre "d'élément" pour qu'en quelque sorte le résultats ressemble à:

Code :
1
2
3
4
5
6
eid    ename    tname
1    voiture    deplacer
1    voiture    moteur
2    velo       deplacer
3    porte      ouvrir
3    porte      bois
(3 e.id différents)

Est-ce possible en SQL ?
buxbux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 18h09   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Citation:
element: [id, name]
elements_tag: [id, element_id, tag_id]
tag: [id, name]
Déjà, id est inutile dans la deuxième table qui est une table associative. La clé primaire de cette table devrait être composée des identifiants des deux tables associées.

Citation:
Or mon souhait est de limiter le nombre "d'élément"
Si tu veux 3 eid, comme element.id est semble t-il auto-incrémenté (ce qui est une bonne chose), il suffit de demander les eid < 4 mais j'ai l'impression que ce n'est pas vraiment ce que tu souhaites car tu n'aurais toujours que les 3 premiers eid.

Veux-tu 3 éléments au hasard et tous les tags associés à ces éléments ?
__________________
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 18/12/2011, 18h17   #3
Membre du Club
 
Homme Bastien Sevajol
Développeur Web
Inscription : mars 2007
Messages : 152
Détails du profil
Informations personnelles :
Nom : Homme Bastien Sevajol
Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2007
Messages : 152
Points : 56
Points : 56
Envoyer un message via MSN à buxbux Envoyer un message via Skype™ à buxbux
Citation:
Envoyé par CinePhil Voir le message
Déjà, id est inutile dans la deuxième table qui est une table associative. La clé primaire de cette table devrait être composée des identifiants des deux tables associées.
Ok

Citation:
Envoyé par CinePhil Voir le message
Veux-tu 3 éléments au hasard et tous les tags associés à ces éléments ?
Non pas au hasard, je ne l'ai pas mis dans mon exemple mais des filtres peuvent intervenir pour choisir les éléments à récupérer.

Donc je cherche à récupérer 3 éléments en fonction de critères (par exemple avec un WHERE e.name LIKE 'a%') ainsi que tous les tags associés.
buxbux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 18h42   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Tu veux dire qu'avec ton LIKE, plus de trois éléments sont susceptibles d'être retournés par la requête et tu ne veux que les trois premiers ?
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT e.id AS eid, e.name AS ename,
	t.id AS tid, t.name AS tname
FROM element e
INNER JOIN element_tag et ON et.element_id = e.id
	INNER JOIN tag t ON t.id = et.tag_id
WHERE e.id IN (
	SELECT id
	FROM element
	WHERE name LIKE 'a%'
	LIMIT 3
)
__________________
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 18/12/2011, 18h46   #5
Membre du Club
 
Homme Bastien Sevajol
Développeur Web
Inscription : mars 2007
Messages : 152
Détails du profil
Informations personnelles :
Nom : Homme Bastien Sevajol
Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2007
Messages : 152
Points : 56
Points : 56
Envoyer un message via MSN à buxbux Envoyer un message via Skype™ à buxbux
Citation:
Envoyé par CinePhil Voir le message
Tu veux dire qu'avec ton LIKE, plus de trois éléments sont susceptibles d'être retournés par la requête et tu ne veux que les trois premiers ?
Exactement. Je suis obligé de passer par une requête imbriquée ?
buxbux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 19h39   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Tu peux aussi faire une jointure sur la sous-requête mais en quoi la "requête" imbriquée te pose problème ?
__________________
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 18/12/2011, 19h48   #7
Membre du Club
 
Homme Bastien Sevajol
Développeur Web
Inscription : mars 2007
Messages : 152
Détails du profil
Informations personnelles :
Nom : Homme Bastien Sevajol
Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2007
Messages : 152
Points : 56
Points : 56
Envoyer un message via MSN à buxbux Envoyer un message via Skype™ à buxbux
Je crois que j'ai été traumatisé à une période par une personne me répétant que si on écrivait une requête imbriquée c'est que l'on pouvait mieux écrire sa requête. Mais je te confie que ton exemple de requête imbriquée colle parfaitement à mon problème en production.

Merci en tout cas de m'avoir rappelé que les sous-requêtes sont là aussi pour ce genre de nécessités

Ps: Bon maintenant faut que j'arrive à mettre un LIMIT à la sous-requête .. dans doctrine héhé.
buxbux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2011, 20h50   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 333
Points : 18 333
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par buxbux Voir le message
Ps: Bon maintenant faut que j'arrive a mettre un LIMIT à la sous requête .. dans doctrine héhé.
Ne te laisse pas imposer la dictature de Doctrine. Fais lui exécuter la requête en SQL Natif. Tu perdrais ton temps pour rien à traduire cette requête dans le pseudo SQL de cette saloperie d'ORM.
__________________
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 18/12/2011, 21h13   #9
Membre du Club
 
Homme Bastien Sevajol
Développeur Web
Inscription : mars 2007
Messages : 152
Détails du profil
Informations personnelles :
Nom : Homme Bastien Sevajol
Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2007
Messages : 152
Points : 56
Points : 56
Envoyer un message via MSN à buxbux Envoyer un message via Skype™ à buxbux
Citation:
Envoyé par CinePhil Voir le message
Ne te laisse pas imposer la dictature de Doctrine. Fais lui exécuter la requête en SQL Natif. Tu perdrais ton temps pour rien à traduire cette requête dans le pseudo SQL de cette saloperie d'ORM.
C'est tentant oui ... Mais d'un coté au sein du framework que j'utilise (symfony2) tout est bien imbriqué et l'utilisation de l'ORM a son avantage.
Mais c'est vrai que pour des requêtes de ce type Doctrine casse les coui**es sévère ^^
buxbux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 00h24   #10
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 686
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 686
Points : 10 435
Points : 10 435
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Si vous êtes limité par l'ORM, n'hésitez pas à mettre votre requête dans une vue.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 10h47   #11
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Citation:
Envoyé par buxbux Voir le message
Je crois que j'ai été traumatisé a une période par une personne me répétant que si on écrivais une requête imbriqué c'est que l'on pouvait mieux écrire sa requête.
Cette personne est sans aucun doute un imbécile, mais il est probable que sa bêtisé à été la conséquence de l'endoctrinement des pro MySQLite.

En effet, MySQL a longtemps été incapable de faire des sous requêtes et prétendait que toute sous requête pouvait être écrite à base de jointures. Ce qui est bien entendu totalement faux ! Lire mon cours sur SQL ou mieux, potasser mon bouquin...

Voila le résultat désastreux et pervers de l'utilisation aveugle de MySQL, qui rappelons le au passage n'est ps réellement un SGBD relationnel... http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 10h52   #12
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
Citation:
Envoyé par buxbux Voir le message
C'est tentant oui ... Mais d'un coté au sein du framework que j'utilise (symfony2) tout est bien imbriqué et l'utilisation de l'ORM a son avantage.
Mais c'est vrai que pour des requêtes de ce type Doctrine casse les coui**es sévère ^^
Et pour en rajouter une couche, lisez ce que j'ai écrit sur les ORM... vous verrez que non seulement :
1) vous pouvez vous en passer
2) vous développerez beaucoup plus vite !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2011, 11h10   #13
Membre du Club
 
Homme Bastien Sevajol
Développeur Web
Inscription : mars 2007
Messages : 152
Détails du profil
Informations personnelles :
Nom : Homme Bastien Sevajol
Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mars 2007
Messages : 152
Points : 56
Points : 56
Envoyer un message via MSN à buxbux Envoyer un message via Skype™ à buxbux
Citation:
Voila le résultat désastreux et pervers de l'utilisation aveugle de MySQL, qui rappelons le au passage n'est ps réellement un SGBD relationnel...
J'en apprend chaque jours un peu plus ^^
J'utilise PostgreSQL en remplacement de MySQL depuis un moment. Je vais tout de même lire votre article.

Citation:
Et pour en rajouter une couche, lisez ce que j'ai écrit sur les ORM... vous verrez que non seulement :
1) vous pouvez vous en passer
2) vous développerez beaucoup plus vite !
J'ai du mal a pouvoir penser qu'au sein d'un développement appuyé par un framework il soit plus judicieux de se passer de l'ORM embarqué. Je met votre article de coté pour le consulter bientôt il éveille ma curiosité tout de même ^^
buxbux 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 20h02.


 
 
 
 
Partenaires

Hébergement Web