IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Dernière entrée pour un champs spécifique dans une jointure [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Dernière entrée pour un champs spécifique dans une jointure
    Bonjour à tous,

    Je bloque sur une requête, elle est assez lourde donc j'essaie de trouver un moyen de l'alléger, et une des solutions serait de ne récupérer qu'un élément dans une table jointe.
    J'ai environ 300k entrées dans la table1 et tout autant dans la table2.

    J'ai besoin de plusieurs élément dans la table1, mais seulement une ligne de la table2 par entrée de la table1.

    Voici ce que j'essaie de faire mais qui ne fonctionne pas :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    	t1.* 
    FROM 
    	table1 t1
    	left join (select * from `table2` t2 where t2.id=t1.id limit 1 order by t2.id) ta2 on 1
    WHERE 
    	t1.id=1

    J'ai essayé avec une variable mais rien n'y fait... la sous requête ne prend pas en compte les données externe :


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT 
    	t1.* 
    	, @num := t1.id
    FROM 
    	table1 t1
    	left join (select * from `table2` t2 where t2.id=@num limit 1 order by t2.id) ta2 on 1
    WHERE 
    	t1.id=1

    J'ai aussi essayé de limité avec une autre sous requête et la fonction max (mais la table est trop lourde je pense) :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    	t1.* 
    FROM 
    	table1 t1
    	left join table2 ta2 on (  ta2.id= t1.id and ta2.id in  (select max(id) from `table2` t2 where t2.id=t1.id ) )
    WHERE 
    	t1.id=1

    Pourriez vous m'aider à trouver une solution s'il vous plait?

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    une des solutions serait de ne récupérer qu'un élément dans une table jointe
    certes mais lequel ? quel serait le critère ?

    Une jointure ne devrait pas poser de performance, même sur de nombreux enregistrement, a condition que les colonnes en jeu soient bien indexées.

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Hello, merci de la réponse.

    La table2 contient plusieurs entrées concernant la table1 donc plusieurs id, et d'après ce que je sais on ne peut pas indexer un champs en doublon.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Les index primaires et uniques sont par définition ... uniques.
    Utilise un index simple.

    Pour mieux comprendre ce qui se passe dans ta requête, n'oublie pas que tu as la fonction EXPLAIN.

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci beaucoup pour ses informations, je ne connaissais pas, je test les 2!

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Ca a très bien fonctionné, merci beaucoup! Et pour avoir la dernière ligne j'ai utilisé une requête que j'ai trouvé en ligne :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT 
    	t1.* 
    FROM 
    	table1 t1
    	left outer join table2 ta2 on (  ta2.id= t1.id )
    	left outer join table2 ta3 on (  ta3.id= t1.id and ta2.key < ta3.key )
    WHERE 
    	t1.id=1
    	and ta3.key is null
    avec id l'identifiant de la table1 et key l'identifiant de la table2.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer la valeur d'un champ spécifique dans une table
    Par kornkiller dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/02/2011, 00h28
  2. Selection d'un champ spécifique dans une requête d'analyse croisé
    Par doudou31 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 09/09/2008, 16h34
  3. Réponses: 7
    Dernier message: 07/09/2008, 09h01
  4. [MySQL] ADDTIME pour un champ specifique dans une boucle while
    Par juju03 dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 18/06/2008, 16h35
  5. Réponses: 6
    Dernier message: 23/01/2007, 10h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo