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 :

requete avec condition


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 67
    Points
    67
    Par défaut requete avec condition
    Bonjour, j'ai un petit problème que je n'arrive pas bien à résoudre...

    J'ai une table article avec les champs id, contenu, origine_id, et language_id.

    Chaque article a un champ id unique, et un champ origine_id qu'il peut partager avec d'autres articles qui seront dotés d'un language_id différent.

    Comment sélectionner les articles en faisant un distinct sur origine_id, et avec la condition suivante : si l'article existe dans le language_id que je spécifie, on prend celui-là, sinon, on prend celui où language_id =1 (chaque article aura une version avec language_id =1).

    Je ne sais pas trop comment poser cette condition ?

  2. #2
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    2 approches...

    la simpliste mais qui n'utilisera aucun index
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select contenu
    from articles
    where origine_id=5 and language_id =2 or language_id =1;

    la version qui te permet au moins un index sur origine_id normalement:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select contenu
    from articles
    where origine_id=5 and (language_id =2 or language_id =1);

    une version plus maline qui utilise les index potentiels sur origine_id et/ou language_id:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select contenu
    from articles
    where origine_id=5 and language_id in (2,1);
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si l'article existe dans les deux langages, ta requête va retourner les deux alors que zoreol veut prioritairement le langage demandé, sinon le langage 1 par défaut.

    Pas le temps d'y réfléchir maintenant, pause de formation terminée.

    A+
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 014
    Points : 23 702
    Points
    23 702
    Par défaut
    Bonjour,

    Avec la requête suivante, ça devrait faire ce que vous cherchez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT COALESCE(a2.id, a.id)
    FROM article a
    LEFT JOIN article a2 ON a.id = a2.origine_id AND a2.language_id = ...
    WHERE a.language_id = 1;
    A noter que le language_id que vous choisissez (et qui est donc paramétrable) est ici a2.language_id = ....
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre expert

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2012
    Messages
    612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 612
    Points : 3 066
    Points
    3 066
    Par défaut
    Bonjour,

    Citation Envoyé par ericd69 Voir le message
    salut,

    2 approches...

    la simpliste mais qui n'utilisera aucun index
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select contenu
    from articles
    where origine_id=5 and language_id =2 or language_id =1;

    la version qui te permet au moins un index sur origine_id normalement:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select contenu
    from articles
    where origine_id=5 and (language_id =2 or language_id =1);

    une version plus maline qui utilise les index potentiels sur origine_id et/ou language_id:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select contenu
    from articles
    where origine_id=5 and language_id in (2,1);
    Les deux premières requêtes ne sont pas équivalentes (priorité du AND).
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    WITH DATA AS (
      SELECT 5 as origine_id, 2 as language_id from dual union
      SELECT 5 as origine_id, 1 as language_id from dual union
      SELECT 3 as origine_id, 1 as language_id from dual
    )
    SELECT * FROM DATA
    WHERE origine_id=5 AND language_id =2 OR language_id =1;
     
    ORIGINE_ID             LANGUAGE_ID            
    ---------------------- ---------------------- 
    3                      1                      
    5                      1                      
    5                      2             
     
     
    WITH DATA AS (
      SELECT 5 as origine_id, 2 as language_id from dual union
      SELECT 5 as origine_id, 1 as language_id from dual union
      SELECT 3 as origine_id, 1 as language_id from dual
    )
    SELECT * FROM DATA
    WHERE origine_id=5 AND (language_id =2 OR language_id =1);
     
    ORIGINE_ID             LANGUAGE_ID            
    ---------------------- ---------------------- 
    5                      1                      
    5                      2
    Les deux dernières en revanche sont équivalentes mais le plan d'exécution sera le même. D'ailleurs si un SGBDR traite différemment des requêtes de ce type, ça en dit long sur la qualité de l'optimiseur

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Si l'article existe dans les deux langages, ta requête va retourner les deux alors que zoreol veut prioritairement le langage demandé, sinon le langage 1 par défaut.

    Pas le temps d'y réfléchir maintenant, pause de formation terminée.

    A+
    Ça doit être bon en ajoutant ceci aux requêtes d'ericd69 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ORDER BY language_id DESC
    LIMIT 1
    Suivant ce que vous cherchez, la requête de ced sera plus utile.

  7. #7
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    j'y avais pensé mais tu ne peux garantir l'ordre de l'id lang sauf à avoir la langue par défaut avec la valeur la plus petite...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

Discussions similaires

  1. requete avec condition
    Par swissmade dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 13/08/2007, 11h32
  2. Requete avec condition sur une partie de l'affichage
    Par dinver78 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/07/2007, 09h19
  3. Requete avec condition interne
    Par inge2007 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/02/2007, 14h29
  4. Calculs dans une requete avec conditions multiples
    Par Sha1966 dans le forum Access
    Réponses: 3
    Dernier message: 13/01/2006, 15h18
  5. Requete avec condition
    Par Tchinkatchuk dans le forum Langage SQL
    Réponses: 3
    Dernier message: 22/06/2005, 09h37

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