Requete avec JOIN : infos dans des bases différentes [MySQL] - SQL/NoSQL - Programmation
Marsh Posté le 21-07-2009 à 10:58:06
Un ami m'a proposé ca :
Code :
|
Et à ce moment là, sql nous retourne les 3 images correspondantes à l'id dans chaque type (à condition que l'id existe).
Il suffit alors de choisir l'image entre les 3 en fonction du type retourné.
Ce n'est pas une mauvaise idée, mais au niveau performance, il doit y avoir mieux à faire. En effet, sql me retourne 2 strings pour rien.
Or c'est une requete que je vais faire très fréquemment. Je souhaite donc l'optimiser un max.
Petit up
Marsh Posté le 21-07-2009 à 17:15:15
Code :
|
je sais pas à quoi correspond ta clause where donc je l'ai laissée
Marsh Posté le 21-07-2009 à 17:52:01
Bien essayé
Mais coalesce retourne le premier non nul.
Or il peut très bien avoir une étoile et une planete qui ont le même id.
L'astre est identifié, non pas juste par un id, mais par son type ET son id au sein de son type
Si vraiment rien n'est faisable, je donnerai effectivement un identifiant unique à tous les astres tel qu'il n'y aura pas de collisions.
Pour la clause where, c'est juste un genre de champs de vision. Chaque astre est visible si on le regarde. Le champs de vision est pour l'instant un carré de 20x20. Mais ca n'influe pas sur la requete
Marsh Posté le 21-07-2009 à 18:09:53
et en remettant le type = X dans les jointures ?
Marsh Posté le 21-07-2009 à 18:18:46
J'essaye ca ce soir
Sinon une petite question toute autre, je cherche à récupérer la valeur de l'index (la clé primaire) d'une table. J'ai d'abord pensé à un SELECT MAX(id), mais on n'est pas à l'abri d'une suppression du dernière enregistrement. J'ai ensuite cherché du coté des fonctions php, mais aucune ne semble remplir cette fonction...
Marsh Posté le 21-07-2009 à 18:49:14
c'est un auto increment ?
je crois que la fonction mysql_insert_id (ou truc comme ça) renvoie le dernier id inséré
Marsh Posté le 21-07-2009 à 19:50:45
Oui il est possible d'avoir l'id à l'insertion. Mais je souhaite le récupérer n'importe quand. Bizarre que personne n'y ait pensé...
Je ne vais quand même pas insérer puis supprimer juste pour avoir l'id, ce serait ridicule...
Marsh Posté le 21-07-2009 à 20:00:54
Voila j'ai testé
SELECT space_map.*, COALESCE(etoile.map_image, planete.map_image, asteroide.map_image) |
En ayant viré le WHERE.
Il n'y a plus d'erreur SQL, mais sql ne renvoie aucun enregistrement...
Pourtant il me semble que l'on ne filtre rien...
Marsh Posté le 21-07-2009 à 20:05:43
c'est normal que ça ne renvoie rien, il faut du left join et pas du inner join
en gros, avec le inner, tu lui demande de renvoyer tous les objets qui sont à la fois une étoile, une planète et un astéroïde. Et j'imagine que tu n'en as pas
Marsh Posté le 21-07-2009 à 20:07:10
Désolé pour ce triple post
En effet, ca fonctionne nickel avec un LEFT JOIN qui lui n'exclut personne en cas d'absence.
Voila le code final :
SELECT space_map.*, |
Merci beaucoup pour ton aide
Marsh Posté le 22-07-2009 à 16:39:34
Encore une petite question.
C'est une requete que je dois exécuter très souvent, il faut donc que je l'optimise un max.
J'ai lu ici http://sqlpro.developpez.com/cours/optimiser/ (partie 9, ligne 12 du tableau) que faire un paquet de UNION est plus rapide qu'un paquet de INNER + coalesce().
Qu'en penses-tu ?
Marsh Posté le 22-07-2009 à 17:17:52
j'en pense que dans ton cas l'union n'est pas la solution la plus performante.
Dans le lien que tu donnes, le point numéro 12 conseille bien de transformer les COALESCE en UNION, mais l'exemple donné se justifie car les données viennent toutes de la même table.
Si tu regardes le point numéro 16, ils conseillent de transformer les UNION en jointures, et l'exemple donné utilise des.... COALESCE !
Donc je dirais : reste comme ça
D'ailleurs ils oublient un conseil important : préférer "UNION ALL" à "UNION" quand cela est possible
Marsh Posté le 21-07-2009 à 01:54:23
Bonjour,
J'ai une table contenant des objets ayant chacun un id.
space_map
x y type id
--------------
0 5 1 6
1 17 3 9
etc...
Chaque enregistrement est soit une étoile, soit une planète, soit un astéroïde selon le champs 'type' (1:etoile, 2:planete, 3:asteroide).
Avec un JOIN, je voudrais chercher l'image de l'objet. Cette image est stockée dans le champs 'map_image' de la table lui correspondant.
En effet, il y a 3 tables 'etoile', 'planete' et 'asteroide'.
Par exemple pour l'étoile :
etoile
id map_image etc...
---------------------------
6 etoile1.png
etc...
Ces 3 tables sont complètement différentes mais ont en commun les champs id et map_image.
Donc je voudrais que selon le type de l'enregistrement, on aille chercher l'image qui correspond dans la table appropriée.
Ca n'a pas l'air très complexe, c'est pourquoi j'ai pensé pouvoir le faire en une seule requète, mais je suis bloqué.
Voila ce que j'ai actuellement :
Mais ca ne fonctionne évidement pas, puisqu'il ne sait pas comment chercher les 2 autres map_image....
Existe-t-il un JOIN spécial qui répondrait à mes attentes ?
Merci de votre attention
Message édité par Pascal le nain le 21-07-2009 à 01:59:14