jointure de table

Petit nouveau ! | 2 Messages

24 janv. 2014, 18:50

Bonjours a tous, je suis nouveau ici. Je fait peu souvent de la programmation, je me débrouille assez bien, mais viens du monde du basic.

j'ai 2 tables, une nommé localisation contenant la variable: ID, LOCALISATION, CC ET FLECHE et une, nomé loctracking, contenant id, localisation, tracking et date

La première contiens une liste de localisation d'entreposage, la 2e enregistre tout les fois que l'on fait une manipulation sur la localisation.

J'affiche une liste des localisation a l'écran avec les détaille de la table 1 et la dernière fois qu'elle a été manipulé dans la table 2.

J'essaie de faire une jointure de table, mais je comprend pas trop comment faire n'y pourquoi elle est pas valide. Actuellement je fait une requête pour trouver une localisation et j'ai une boucle qui pour chaque localisation trouve la dernière fois la localisation a été manipuler. Ça fonctionne bien, mais c’est terriblement lent.

Ce code me semble valide, mais je e sais pas comment trouver la dernière enregistrement de la 2e table. Ce qu'il y a de commun c'est le champs localisation. la première table a un alias A et et la 2e table à un alias B. moi je cherche la localisation , trier par date et limité par 1 dans ma méthode lente (requête dans requête)

Code : Tout sélectionner

SELECT a.id, a.localisation, a.cc, a.fleche, b.id, b.localisation, b.tracking FROM localisation a INNER locktracking b ON a.localisation = b.localisation WHERE a.localisation >= '$l1' && a.localisation <= '$l2' ORDER BY a.localisation
P.S. $l1 et $l2 et le début et la fin de la recherche (example recherche entre 40 et 80)

Si quelqu'un peu m’aiguiller sur pourquoi ma requête ne serais pas valide et comment retrouver la dernière manipulation dans la table 2 ça serais trop aimable.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 janv. 2014, 00:06

salut,

1/ ton modèle n'est pas bon c'est la clef primaire que l'on utilise en clef étrangère et non un des autres champs (même si c'est clef candidate).

Du coup la seconde table peut être différentes. regarde le MCD.

2/ pur ce qui est jointures voici un tuto http://sqlpro.developpez.com/cours/sqla ... es/#LIII-B
cela passera par les clefs.

3/ pour avoir la date la plus récente il faut penser : prendre la plus grande, du coup du utilise la fonction max().

par exemple
SELECT idlocalisation,
       localisation,
       cc,
       fleche,
       idtracking,
       tracking,
       dateMouvement
  FROM localisation l1
  join tracking
 using (idlocalisation)
 WHERE localisation >='$11' and localisation <= '$12'
   and dateMouvement = (select max(dateMouvement)
                          from tracking
                         where idlocation = l1.idlocation)
Si localisation est un entier tu n'as pas besoin de mettre des ' (même tu ne doit pas les utiliser).


c'est à tester comme requête ;)

@+
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Il en faut peu pour être heureux ......

Petit nouveau ! | 2 Messages

27 janv. 2014, 14:50

Un gros merci pour les explication, je vérifierai le tout aujourd'hui :) la location est pas un entier, mais un varchar, il contiens des lettre a l'intérieur.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

28 janv. 2014, 12:28

pas de soucis pour la localisation du moment que tu tu as un PK quelque part (une clef primaire ça peux être un varchar pas de soucis, c'est juste plus lent à l a recherche qu'un entier c'est pour cela que j'ai mis un id. TU peux aussi ajouter un index unique sur la colonne du nom pour être certain qu'il n'y aura pas de doublon ;) ).


Et sinon si le sujet te semble résolus tu peux cliquer sur le bouton vert à droite du titre stp ;)


@+
Il en faut peu pour être heureux ......