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

Requêtes MySQL Discussion :

Eviter une sous-requête


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Eviter une sous-requête
    Bonjour à tous,
    Après quelques recherches je pense que la solution à mon problème est un sous requête dans la clause FROM mais peut-être existe t'il une solution.

    Le problème est le suivant.... il s'agit en fait de récupérer l'enregistrement ayant la clé primaire la plus élevé parmi une table jointe ayant des doublons.
    Voici un exemple de code similaire au mien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t1.col1,t1.col2,t1.col3,t1.col4,...,t2.colo1,t2.colo2,t2.colo3,t2.colo4,t2.colo5,...
    FROM table1 AS t1 
    LEFT JOIN table2 AS t2 ON t1.col2=t2.colo2 AND t1.col3=t2.colo3 
    WHERE (Conditions sur la table1)
    Donc là tout va bien, jointure classique... seulement ma table t2 contient plusieurs enregistrements correspondant à ma jointure.
    Ce que j'aimerais c'est récupérer seulement l’enregistrement ayant le t2.colo1 (primaire) le plus élevé sans ajouter un nouveau champ ou faire une sous-requête. Juste en ajoutant quelque chose prés de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...LEFT JOIN table2 AS t2 ON t1.col2=t2.colo2 AND t1.col3=t2.colo3 AND ??? WHERE...
    Est ce possible d’après vous?

    Merci par avance.

    Édition le 07/11/13 à 12:00:
    Finalement, j'ai ajouté un champ à ma table afin de pouvoir faire les sélections souhaitées.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonjour,

    peut tu poster ta modification au cas où une personne veut faire la même chose que toi.

    Pour ton problème une solution peut être de faire un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT t1.col1,t1.col2,t1.col3,t1.col4,...,t2.colo1,t2.colo2,t2.colo3,t2.colo4,t2.colo5,...
    FROM table1 AS t1 
    LEFT JOIN table2 AS t2 ON t1.col2=t2.colo2 AND t1.col3=t2.colo3 
    WHERE (Conditions sur la table1)
    ODER BY t2.colo1 DESC
    LIMIT 1;
    une réponse vous a permis d'avancer ?

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Bonjour,
    Merci pour cette réponse.

    En fait, j'ai rajouté un champ dans ma table t2 afin de pouvoir la filtrer plus précisément et ne faire remonter que l'enregistrement qui m'intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t1.col1,t1.col2,t1.col3,t1.col4,...,t2.colo1,t2.colo2,t2.colo3,t2.colo4,t2.colo5,t2.coloNew,...
    FROM table1 AS t1 
    LEFT JOIN table2 AS t2 ON t1.col2=t2.colo2 AND t1.col3=t2.colo3 AND t2.coloNew='ma_value' 
    WHERE (Conditions sur la table1)
    Pour en revenir au "LIMIT 1" je ne suis pas sur que cela fonctionne dans mon cas (mais je n'ai pas testé) car j'ai besoin de faire remonter plusieurs enregistrements de la table t1 et seulement 1 sur la table t2.
    Je pense que cette solution aurait pu fonctionner en utilisant le ORDER BY ... DESC ... LIMIT 1 dans une sous requête situé dans le FROM de la requête principale.

    Pour les intéressés voir ce lien sur le site de MySQL.

    Encore merci Exia93 de t'être penché sur mon problème et j'espère que cette réponse pourra servir à quelqu'un.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Ok et avec un simple MAX + GROUP BY ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT t1.col1,..., MAX(t2.col1)
    FROM table1 AS t1 
    LEFT JOIN table2 AS t2 ON t1.col2=t2.colo2 AND t1.col3=t2.colo3 
    WHERE (Conditions sur la table1)
    GROUP BY t1.col1, ..., toutes_colonnes_du_select_sauf_le_MAX
    S'il te faut plusieurs information de la t2 et pas seulement l'id il faudra obligatoirement passer par une sous requête ou utiliser ta solution malgré que je n'aime pas trop ta solution (j'imagine que tu stocke dans ta colonne coloNew le fait que le tuple ait le plus grand id par rapport à t1).
    une réponse vous a permis d'avancer ?

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Oui, j'avais besoin de plusieurs champs de l'enregistrement ayant l'id le plus élevé.

    J'avais effectivement testé avec un MAX(t2.col1) mais sans GROUP BY. Le MAX() faisait bien son office et me renvoyait bien l'id le plus grand seulement le résultat sur les autres colonnes de la t2 était ceux de la première ligne trouvé par SQL.

    Je conçois que ma solution n'est pas idéale mais elle fonctionne sans casser le reste (elle est placée dans une fonction générique) de l'appli.
    Pour information, le champs ajouté est un BOOLEAN. Si "true" la ligne remonte si aucun "true" n'est trouvé alors les colonnes sont à "NULL".

  6. #6
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2013
    Messages
    142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 142
    Points : 295
    Points
    295
    Par défaut
    est-ce que ceci peut t'inspirer ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select t1.*, temp.*
    from table1 t1
    inner join (select distinct t2.id as id from table2) temp on temp.id = t1.id
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select t1.*, temp.*
    from table1 t1
    inner join (select autreChamp, max(t2.id) as id from table2 group by autreChamp) temp on temp.id = t1.id

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Dordogne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2011
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Salut Easy-bi,
    Merci pour cette réponse.

    Le INNER JOIN ne convient pas à ma sélection mais la sous-requête, elle, pourrait convenir moyennant un WHERE (qqch sur table t2).

    Mes excuses, je suis sur autre chose et ne peux pas tester dans l'instant pourtant cette sous-requête doit fonctionner sans souci.

    Merci à tous pour vos commentaires.

Discussions similaires

  1. Eviter une sous-requête..
    Par Lideln75 dans le forum Requêtes
    Réponses: 6
    Dernier message: 28/04/2009, 20h18
  2. [Hibernate]Traduire une sous requète en criteria?
    Par djodjo dans le forum Hibernate
    Réponses: 2
    Dernier message: 15/06/2006, 13h53
  3. Update avec une sous requête
    Par Deejoh dans le forum Installation
    Réponses: 7
    Dernier message: 25/01/2006, 11h50
  4. Ramener plusieurs champs dans une sous requête...
    Par David.V dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 12/01/2005, 07h54
  5. Réponses: 3
    Dernier message: 18/05/2003, 00h16

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