un join ?

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : un join ?

par jojolapine » 30 nov. 2006, 16:42

Oui c'est plus clair! j'ai compris l'idée ;)
Après, le refaire dans d'autres situations sans votre aide, c'est pas pour tout de suite :langue: !!
merci beaucoup

par Hubert Roksor » 30 nov. 2006, 14:38

Je pensais avoir fait un post sur les tables dérivées mais je ne le trouve pas, donc j'ai dû le rêver. Pour info, l'entrée du manuel est là.

Donc pour en revenir à l'exemple ci-dessus, la première requête nous donne une série de user_id, ok ? imagine que tu mets tous ces résultats dans une table temporaire qu'on appelera "uid". On pourrait par exemple le faire avec:

Code : Tout sélectionner

CREATE TEMPORARY TABLE uid SELECT DISTINCT users.user_id FROM users JOIN photos USING (user_id)
On a dit que ces user_id nous servaient à récupérer les données utilisateurs, on pourrait donc faire

Code : Tout sélectionner

SELECT users.* FROM uid JOIN users USING (user_id)
Ben les tables dérivées c'est exactement ça, mis à part qu'on a pas besoin de créer de table temporaire, elle est créée automatiquement durant la requête et elle est détruite tout de suite après. D'ailleurs, tu remarqueras que les requêtes sont identiques, on a juste à mettre la déclaration de la table entre parenthèses dans la clause FROM. Mmh, c'est plus clair comme ça ? les tables dérivées ce sont des tables temporaires que l'on crée durant une requête.

par jojolapine » 30 nov. 2006, 13:33

la première méthode fonctionne parfaitement, mais je ne l'ai pas comprise :?
j'ai copris la première requête, parce qu'elle est plus simple, mais la deuxième :shock:

par Hubert Roksor » 30 nov. 2006, 13:22

En imaginant que l'ID des utilisateurs est "user_id" et que tu as eu l'excellente idée de lui donner le même nom dans la table des photos, la requête pour récupérer tous les "user_id" ressemblerait à

Code : Tout sélectionner

SELECT DISTINCT users.user_id FROM users JOIN photos USING (user_id)
...ce qui correspond à dire "donne-moi tous les user_id distincts qui possèdent une équivalence dans la table photos".

Ensuite il ne nous reste qu'à transformer cette requête en table dérivée pour récupérer toutes les données utilisateurs que l'on veut:

Code : Tout sélectionner

SELECT u.* FROM ( SELECT DISTINCT users.user_id FROM users JOIN photos USING (user_id) ) AS uid JOIN users u USING (user_id)

Alternativement, on peut utiliser cette syntaxe mais elle est généralement plus lente et mettre des sous-requêtes dans la clause WHERE est souvent une mauvaise pratique.

Code : Tout sélectionner

SELECT * FROM users WHERE EXISTS (SELECT * FROM photos WHERE user_id = users.user_id)
Sous MySQL et selon le mode on peut aussi faire ça, mais je le déconseille pour des raisons de compatibilité future et avec les autres SGBD

Code : Tout sélectionner

SELECT u.* FROM users JOIN photos USING (user_id) GROUP BY u.user_id
Ça ne fonctionne que si MySQL n'utilise pas le mode "ONLY_FULL_GROUP_BY"

un join ?

par jojolapine » 30 nov. 2006, 13:04

Bonjour,
en fait je sais pas trop si le join est de mise, mais voici ce que je veu faire:
j'ai une bdd qui contient deux tables:
la table users, avec un id unique, le reste on s'en fiche
et la table photos, avec une entrée par photos, et en id externe, l'id de users...
ce que je veu faire c'est selectionner les entrée dans users, qui ont des entrées dans photos, j'avais pensé à ça:

Code : Tout sélectionner

SELECT * FROM `users` WHERE (SELECT count(*) FROM `photos` WHERE `id`= )<>0
mais premièrement, je ne sais pas quoi mettre dans id, et ensuite est-que c'est rapide est-ce qu'il n'y a pas meiu?