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 :

Sélection de données d'une table à partir de critères provenant d'une autre table


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut Sélection de données d'une table à partir de critères provenant d'une autre table
    Bonjour,

    A partir d'une table simulation_systeme_globale_temp je cherche à mettre à jour une colonne en fonction de plusieurs critères l'ensemble étant dépendant des données inscrites dans la table sciences.systemes, avant de faire une requête générale pour toutes les lignes de la table simulation_systeme_globale_temp, j'ai d'abord essayé sur une sélection :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                                                AND T.ls='5'
                                                AND S.reference='1'
    et je souhaite sélectionner donc les lignes pour lesquelles :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT * FROM simul_sys T, sys S
                                                WHERE T.flui IS NULL
                                                AND T.ls='5'
                                                AND S.reference='1'
                                                AND LOCATE(CONCAT(S.el_e,'_',S.reference),'eau_1')>0
                                                AND LOCATE('eau',T.el_e)>0
                                                AND (
                                                    (LOCATE(CONCAT(T.appellation,'_',T.rep_c,'\r\n'),S.lt)>0
                                                AND LOCATE(CONCAT('\r\n',T.appellation,'_',T.rep_c),S.lt)>0 
                                                    )
                                                OR LOCATE(CONCAT(';;',T.appellation,'_',T.rep_c,';;'),S.lt)>0
                                                    )
    Or cette requête ne fait qui est souhaité et ne trouve aucune ligne alors que j'ai bien toutes ces conditions qui sont respectées.
    Je pense que ma requête est mal construite, il doit y avoir un problème de sélection des données entre les deux tables...
    Auriez vous une idée pour améliorer ceci ?

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Sans la structure des tables, un jeu de test et le résultat attendu, il est difficile de dire ce qui ne va pas.
    Quoi qu'il en soit, je commencerai par réécrire la requête en utilisant JOIN pour la jointure entre les deux tables.

    Ca ne changera peut-être pas grand chose concernant le résultat, mais la requête sera bien plus facile à lire. Ici il est difficile de voir le lien entres les deux tables.

    Tatayo.

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Bonjour,

    En fait le problème je pense viens de la structure de ma requête car en faisant cette requête simplifiée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT appellation, rep_c, el_e FROM simul_sysT JOIN sys S WHERE T.flui S NULL AND T.ls='5' AND S.reference='1'
    J'obtiens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    appellation, rep_c, el_e
    GF 	1 	c_elec
    GF 	1 	eau
    GF 	2 	c_elec
    GF 	1 	c_elec
    GF 	1 	eau
    GF 	2 	c_elec
    GF 	1 	c_elec
    Alors que je devrais obtenir des lignes supplémentaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    appellation, rep_c, el_e
    GF 	2 	eau
    Il ne trouve pas la ligne avec r_c=2 et je précise que je suis d'autant plus étonné que la seule différence entre ces deux lignes :
    et
    c'est uniquement r_c

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Il n'y a pas de critère de jointure dans la requête, donc tu fais un produit cartésien entre les deux tables.

    De plus dans l'exemple donnée, les colonnes filtrées ne sont pas dans les résultats.
    Donc ici aussi il est difficile de voir ce qui ne va pas.

    Et il manque toujours la structure des tables et le jeu de test.

    Tatayo.

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    D'accord je comprends qu'il y a un pb de jointure c'est plus clair. Merci pour ta réponse je vais travailler la requête dans ce sens...

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Pour la jointure, il manque juste l'opérateur ON avec les colonnes qui vont bien après JOIN.
    Mais ça n'explique absolument pas les lignes manquantes, au contraire : faute de critère de jointure, le produit cartésien effectué ramène toutes les lignes...
    Il faut donc, comme expliqué par Tatayo, communiquer le script complet de création des tables en jeu (ordres CREATE TABLE) et la requête complète.

  7. #7
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    En fait après avoir testé différentes solutions, je m'aperçois que la commande LOCATE(CONCAT('\r\n',char),champ)>0 ne détecte pas ce que je cherche. Du coup la question se porte plutôt sur l'utilisation de \r\n.
    Dans mon cas j'ai un champ qui contient des chaines saisies sous notepad par exemple et collées directement dans la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    texte;;texte
    text2;;texte2
    Comment détecter ou trouver tous les sauts de lignes sous mysql ?

    CHAR(10 using utf8) ?
    CHAR(13) ?
    CHAR(10) ?

  8. #8
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Visiblement la commande qui marche le mieux serait en utilisant replace et le string "\r\n":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LOCATE(CONCAT(T.appellation,'_',T.r_c,';;'),REPLACE(S.lt,'\r\n',';;'))>0
    Est il nécessaire d'écrire deux fois replace avec \r et \n séparés ...?

    Je pense que le problème rencontré venait principalement de là car j'ai retrouvé des résultats attendus.

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

Discussions similaires

  1. UPDATE à partir de données d'une autre table
    Par _Carole dans le forum Langage SQL
    Réponses: 5
    Dernier message: 24/04/2013, 11h31
  2. Update d'une table à partir des données d'une autre
    Par gregoryacf dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/04/2008, 14h02
  3. Réponses: 7
    Dernier message: 16/01/2007, 15h54

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