Logo du forum
 

Forum TTH-News

| Inscription | | Recherche | | FAQ | | Accueil | | Liste des membres |
| Calendrier |
 
Vous n'êtes pas identifié! [Connexion] ou [Inscription] Forum » Programmation » [SQL / PL-SQL / SGBD] » Construction d'une requête
Login Mot de passe

1 visiteurs sur ce topic (0 membre(s), 1 invité(s) )


Auteur
Sujet : Construction d'une requête
zorgh
Master
Membre # 7668

 Avatar du membre
Lieu : FRANCE

Messages :
869 (0.15 par jour)


Score :

Message du 13-03-2009 @ 19:31      Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   


Bonjour,

J'ai du mal à construire une requête. Connaissant le nickname de l'utilisateur, je souhaiterai afficher le nom de son groupe d'affectation (attribut name de la table groups).
L'attribut id de la table groups est mis en relation avec l'attribut id_object de la table users_groups.



J'ai pensé à cette requête :

select name from groups where id = (select id_group from users_groups where id_object = (select id_user from users where nickname = " toto");

Mais n'y a t-il pas quelque chose de plus propre et plus simple que des sous-requêtes ?

Merci bien
----------
Toshiba M30X-125 Intel Centrino PM 1,7 Ghz - 1 Go DDR - DD 60 Go - 15,4"W TFT - Ati Radeon 9700
- Haut de page -
finalspirit
Vétéran
Membre # 4199

 Avatar du membre
Lieu : Lyon (NPDC dans l'âme)

Messages :
5997 (1.01 par jour)


Score :

Message du 13-03-2009 @ 21:25   Site personnel   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Il y a plus simple comme :
SELECT name FROM groups, users, user_groups WHERE id = id_groups AND id_object = id_user AND nickname LIKE "toto";

Si les trois tables sont dans la même base ;) sinon il faut utiliser les inner join ;)

----------
La vie n'est qu'un jeu que l'on programme au hasard... ;)
- Haut de page -
zorgh
Master
Membre # 7668

 Avatar du membre
Lieu : FRANCE

Messages :
869 (0.15 par jour)


Score :

Message du 13-03-2009 @ 21:33   Site personnel   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Merci bien FinalSpirit . Je vais tester.
----------
Toshiba M30X-125 Intel Centrino PM 1,7 Ghz - 1 Go DDR - DD 60 Go - 15,4"W TFT - Ati Radeon 9700
- Haut de page -
zorgh
Master
Membre # 7668

 Avatar du membre
Lieu : FRANCE

Messages :
869 (0.15 par jour)


Score :

Message du 14-03-2009 @ 9:13   Site personnel   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Pour bien expliquer le problème, j'ai modifié dans le post l'identifiant unique de la table users.
Ainsi, id est devenu id_user.
Or je travaille sur un schéma de base relationnel que je ne peux pas modifier.
La requête conseillée me génère donc logiquement ce message d'erreur :

#1052 - Column 'id' in where clause is ambiguous

[message édité le 14-03-2009 @ 9:14 Par zorgh]
----------
Toshiba M30X-125 Intel Centrino PM 1,7 Ghz - 1 Go DDR - DD 60 Go - 15,4"W TFT - Ati Radeon 9700
- Haut de page -
Paddy
Vétéran
Membre # 8375

 Avatar du membre
Lieu : Sélestat

Messages :
8550 (1.51 par jour)


Score :

Message du 14-03-2009 @ 10:06   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

rajoute le nom de la table comme ceci :

SELECT name FROM groups, users, user_groups WHERE groups.id = users_groups.id_groups AND users_groups.id_object = users.id_user AND nickname LIKE "toto";

J'ai rajouté le nom de la table pour tout les id au cas ou ils s'appelleraient tous id dans la réalité ;)

Tu peux également donner un nom a chaque table de la clause FROM ainsi, pour simplifier :

SELECT name FROM groups g, users u, user_groups ug WHERE g.id = ug.id_groups AND ug.id_object = u.id_user AND nickname LIKE "toto";

[message édité le 14-03-2009 @ 10:09 Par Paddy]
----------
Masterdiablo /// PS3 - Wii U - iPhone 7s 256Go - iPhone 6s 128Go (pour Madame)
Core i5 7600K - Asus Prime Z270-A - 2*8Gb Corsair Vengeance - Asus GeForce DUAL-GTX1070-O8G - Samsung 850 Pro 256Go - WD Black 2To - Fractal Define R5 Black
- Haut de page -
zorgh
Master
Membre # 7668

 Avatar du membre
Lieu : FRANCE

Messages :
869 (0.15 par jour)


Score :

Message du 14-03-2009 @ 10:45   Site personnel   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

Merci Paddy pour ces compléments d'info. Cela fonctionne correctement. En fait c'est tout simple.

Une dernière question : on vient de simplifier la requête. Est-elle pour autant optimisée ? je fais allusion au traitement et au temps d'exécution de cette requête.

Faut-il éviter d'utiliser des sous-requêtes ? est-ce maladroit en terme d'optimisation (temps d'exécution) ?

Encore merci FinalSpirit et Paddy pour votre contribution

[message édité le 14-03-2009 @ 10:46 Par zorgh]
----------
Toshiba M30X-125 Intel Centrino PM 1,7 Ghz - 1 Go DDR - DD 60 Go - 15,4"W TFT - Ati Radeon 9700
- Haut de page -
RaTo
Master
Membre # 14302

 


Messages :
885 (0.17 par jour)


Score :

Message du 02-04-2009 @ 15:33   Afficher le profil   Envoyer un message privé   Editer le message   Citer le message      Afficher l'adresse IP   Alerter les modérateurs   

zorgh a écrit

Merci Paddy pour ces compléments d'info. Cela fonctionne correctement. En fait c'est tout simple.

Une dernière question : on vient de simplifier la requête. Est-elle pour autant optimisée ? je fais allusion au traitement et au temps d'exécution de cette requête.

Faut-il éviter d'utiliser des sous-requêtes ? est-ce maladroit en terme d'optimisation (temps d'exécution) ?

Encore merci FinalSpirit et Paddy pour votre contribution



Les sous requêtes sont clairement déconseillées pour ce qui est de la performance.
La requête de Paddy est quasiment la plus optimale, à la rigueur si tu as le nickname exact, tu peux utiliser un "=" plutôt qu'un LIKE ça sera moins gourmand.


- Haut de page -


Aller dans le forum :  

Plan du forum | Contacter l'administrateur

Powered by SoulBB 3.0.1
© Soulmanto, 2003-2010

Valid XHTML 1.0 Transitional

Page générée en 0.046 secondes