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 :

SQL pure : Condition dans une table enfant...


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Par défaut SQL pure : Condition dans une table enfant...
    Alors voila, je récupère des informations dans 4 tables. Mon problème est le suivant :

    Il y a des articles, ces articles ont des images, qui peuvent être nombreuses (ou inexistante grace à LEFT JOIN). Moi, je veux récupérer les URL_MEDIA attaché à l'article qui a comme paramètre QUALITE_MEDIA = 'newsletter'.

    Est possible vu que mes condition WHERE sont sur une autre table ? publication_article_ico (Précision : je suis sous mysql 4.0)

    (En tous les cas pas avec ça…)


    SELECT article_ico.ID_ARTICLE, article_ico.TITRE_ARTICLE, article_ico.SUR_TITRE_ARTICLE, article_ico.CHAPO_ARTICLE, article_ico.TEXTE_ARTICLE, article_ico.DOMAINE_METIER_ARTICLE, article_ico.SECTEUR_ACTIVITE_ARTICLE, publication_article_ico.DATE_PUBLICATION, media_ico.URL_MEDIA, media_ico.LEGENDE_MEDIA, media_ico.DATE_MEDIA, media_ico.LIENS_MEDIA, profil_ico.NOM_PROFIL, profil_ico.PRENOM_PROFIL

    FROM article_ico, publication_article_ico

    LEFT JOIN art_media_ico ON (art_media_ico.ID_ARTICLE = article_ico.ID_ARTICLE)

    LEFT JOIN media_ico ON (media_ico.ID_MEDIA = art_media_ico.ID_MEDIA) /* TABLE DE JOINTURE */

    LEFT JOIN profil_ico ON (media_ico.ID_PROFIL = profil_ico.ID_PROFIL)

    WHERE article_ico.ID_ARTICLE = publication_article_ico.ID_ARTICLE

    AND publication_article_ico.ID_PUBLICATION = 2

    AND publication_article_ico.PUBLIE_ARTICLE = 1

    AND publication_article_ico.ID_SECTION = 6

    AND publication_article_ico.NUMERO_PUBLICATION = 4

    AND (

    SELECT media_ico.QUALITE_MEDIA FROM media_ico WHERE media_ico.QUALITE_MEDIA = 'newsletter'
    /* Le probleme est la */
    )

    ORDER BY article_ico.ID_ARTICLE DESC


    Merci pour votre aide.

    [Edit][Adjanakis] Titre du sujet

  2. #2
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut Re: SQL pure : Condition dans une table enfant...
    Citation Envoyé par l_apotre
    (Précision : je suis sous mysql 4.0)

    (...)

    AND (

    SELECT media_ico.QUALITE_MEDIA FROM media_ico WHERE media_ico.QUALITE_MEDIA = 'newsletter'
    /* Le probleme est la */
    )

    (...)
    MySQL 4.0 n'accepte pas les requêtes imbriquées. Voilà pourquoi ça marche pas.

    Est-ce que tu pourrais nous donner la structures de tes tables (les CREATE TABLE utilisés pour créer les tables) et nous dire ce que tu attends comme résultat, s'il te plait? Merci.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Par défaut
    En fait le probléme a changer quelque peu :
    Au début je souhaitais récuperer les medias d'une certaine qualité pour en mettant une condition sur une table enfant.
    Il suffisait de mettre la condition dans la clause WHERE (tout simplement) et de faire un GOUP BY (au cas ou la table enfant avait plusieurs resultats) :

    SELECT article_ico.ID_ARTICLE, article_ico.TITRE_ARTICLE, article_ico.SUR_TITRE_ARTICLE, article_ico.CHAPO_ARTICLE, article_ico.TEXTE_ARTICLE, article_ico.DOMAINE_METIER_ARTICLE, article_ico.SECTEUR_ACTIVITE_ARTICLE, publication_article_ico.DATE_PUBLICATION, media_ico.URL_MEDIA, media_ico.LEGENDE_MEDIA, media_ico.DATE_MEDIA, media_ico.LIENS_MEDIA, profil_ico.NOM_PROFIL, profil_ico.PRENOM_PROFIL
    FROM article_ico, publication_article_ico
    LEFT JOIN art_media_ico ON (art_media_ico.ID_ARTICLE = article_ico.ID_ARTICLE)
    LEFT JOIN media_ico ON (media_ico.ID_MEDIA = art_media_ico.ID_MEDIA)
    LEFT JOIN profil_ico ON (media_ico.ID_PROFIL = profil_ico.ID_PROFIL)
    WHERE article_ico.ID_ARTICLE = publication_article_ico.ID_ARTICLE
    AND publication_article_ico.ID_PUBLICATION = 2
    AND publication_article_ico.PUBLIE_ARTICLE = 1
    AND publication_article_ico.ID_SECTION = 6
    AND publication_article_ico.NUMERO_PUBLICATION = 4
    AND media_ico.QUALITE_MEDIA = 'newsletter'
    GROUP BY article_ico.ID_ARTICLE
    ORDER BY article_ico.ID_ARTICLE DESC

    Maintenant, mon probléme à changé quelque peu. En fait quand un article n'a pas de média de cette qualité (donc media_ico.QUALITE_MEDIA = 'newsletter' ne trouve pas de média), la requete ne me renvoi aucun enregistrement malgré les LEFT JOIN...

    C'est un peu pénible car s'il n'y a pas de média de cette qualité alors il n'y a pas d'article du tout...

    J'espere ne pas avoir été trop confus.

    Merci bcp !



    Voici les tables >>>

    CREATE TABLE art_media_ico (
    ID_ARTICLE int(10) unsigned default NULL,
    ID_MEDIA bigint(20) unsigned default NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    # --------------------------------------------------------

    #
    # Structure de la table `article_ico`
    #

    CREATE TABLE article_ico (
    ID_ARTICLE int(11) NOT NULL auto_increment,
    SUR_TITRE_ARTICLE varchar(250) default NULL,
    SUR_TITRE_ARTICLE_EN varchar(250) default NULL,
    TITRE_ARTICLE varchar(250) default NULL,
    TITRE_ARTICLE_EN varchar(250) default NULL,
    CHAPO_ARTICLE varchar(250) default NULL,
    CHAPO_ARTICLE_EN varchar(250) default NULL,
    TEXTE_ARTICLE text,
    TEXTE_ARTICLE_EN text,
    DATE_CREATION_ARTICLE date default NULL,
    DATE_MOD_ARTICLE date default NULL,
    DOMAINE_METIER_ARTICLE int(11) default NULL,
    SECTEUR_ACTIVITE_ARTICLE int(11) default NULL,
    SUJET_PRINCIPAL_ARTICLE varchar(250) default NULL,
    SUJET_SECONDAIRE_ARTICLE varchar(250) default NULL,
    NOMENCLATURE_ICO_ARTICLE varchar(250) default NULL,
    NOTES_ARTICLE varchar(250) default NULL,
    NOTES_ARTICLE_EN varchar(250) default NULL,
    MOT_CLEF_ARTICLE varchar(250) default NULL,
    MOT_CLEF_ARTICLE_EN varchar(250) default NULL,
    PRIMARY KEY (ID_ARTICLE)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    # --------------------------------------------------------

    #
    # Structure de la table `media_ico`
    #

    CREATE TABLE media_ico (
    ID_MEDIA bigint(20) unsigned NOT NULL auto_increment,
    ID_PROFIL varchar(250) default NULL,
    URL_MEDIA varchar(250) default NULL,
    NOM_IMAGE varchar(250) default NULL,
    LEGENDE_MEDIA varchar(250) default NULL,
    LEGENDE_MEDIA_EN varchar(250) default NULL,
    TYPE_MEDIA varchar(250) default NULL,
    QUALITE_MEDIA varchar(10) default NULL,
    DATE_MEDIA varchar(150) default NULL,
    LIENS_MEDIA varchar(250) default NULL,
    POID_MEDIA varchar(200) NOT NULL default '',
    PRIMARY KEY (ID_MEDIA)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    # --------------------------------------------------------

    #
    # Structure de la table `profil_ico`
    #

    CREATE TABLE profil_ico (
    ID_PROFIL int(10) unsigned NOT NULL auto_increment,
    abo_id bigint(20) unsigned default '0',
    ID_ORGANISME int(10) unsigned default '0',
    FONCTION_PROFIL varchar(150) default NULL,
    STATUT_PROFIL varchar(20) default NULL,
    NOM_PROFIL varchar(150) default NULL,
    PRENOM_PROFIL varchar(150) default NULL,
    LOGIN_PROFIL varchar(25) default NULL,
    PASSWORD_PROFIL varchar(100) default NULL,
    EMAIL_PROFIL varchar(250) default NULL,
    TEL_MOB_PROFIL varchar(30) default NULL,
    TEL_FIXE_PROFIL varchar(30) default NULL,
    TEL_BUR_PROFIL varchar(30) default NULL,
    AD_DONNEE_PROFIL varchar(10) default NULL,
    FAX_PROFIL varchar(30) default NULL,
    ADRESSE_PROFIL varchar(150) default NULL,
    CP_PROFIL varchar(10) default NULL,
    VILLE_PROFIL varchar(100) default NULL,
    ETAT_REGION_PROFIL varchar(250) default NULL,
    PAYS_PROFIL varchar(50) default NULL,
    SITE_INTERNET_PROFIL varchar(254) default NULL,
    ABONNE_PROFIL tinyint(1) default NULL,
    TYPE_ABONNEMENT_PROFIL varchar(100) default NULL,
    DATE_ADHESION_PROFIL timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
    DATE_VISITE_PROFIL timestamp NOT NULL default '0000-00-00 00:00:00',
    PARAMS_PROFIL varchar(10) default NULL,
    RANDOM_KEY varchar(200) NOT NULL default '',
    FORMAT_NEWS_PROFIL varchar(15) NOT NULL default 'html',
    NEWS_BUY_PROFIL varchar(10) default NULL,
    NEWS_ICONOMIX_PROFIL varchar(10) default NULL,
    CONNU_PROFIL varchar(250) default NULL,
    CONNU_PROFIL_COMMENTAIRE mediumtext,
    ATTENTES varchar(250) default NULL,
    ATTENTES_COMMENTAIRE mediumtext,
    PRIMARY KEY (ID_PROFIL)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    # --------------------------------------------------------

    #
    # Structure de la table `publication_article_ico`
    #

    CREATE TABLE publication_article_ico (
    ID_PUBLICATION_ARTICLE int(10) unsigned NOT NULL auto_increment,
    ID_ARTICLE int(10) unsigned default NULL,
    ID_PUBLICATION int(10) unsigned default NULL,
    PAGES_PUBLICATION varchar(100) default NULL,
    PUBLIE_ARTICLE tinyint(1) default NULL,
    ID_SECTION int(10) unsigned default NULL,
    ID_RUBRIQUE int(10) unsigned default NULL,
    ID_SOUS_RUBRIQUE int(10) unsigned default NULL,
    NUMERO_PUBLICATION int(10) unsigned default NULL,
    DATE_PUBLICATION date default NULL,
    PRIMARY KEY (ID_PUBLICATION_ARTICLE)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    [/u]

  4. #4
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Un début de solution:

    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
    SELECT 
      article_ico.*,
      publication_article_ico.*,
      media_ico.*,
      profil_ico.*
     
    FROM article_ico 
     
    INNER JOIN publication_article_ico ON (article_ico.ID_ARTICLE = publication_article_ico.ID_ARTICLE)
     
    INNER JOIN art_media_ico ON (art_media_ico.ID_ARTICLE = article_ico.ID_ARTICLE)
     
    INNER JOIN media_ico ON (media_ico.ID_MEDIA = art_media_ico.ID_MEDIA) 
     
    INNER JOIN profil_ico ON (media_ico.ID_PROFIL = profil_ico.ID_PROFIL)
     
    WHERE publication_article_ico.ID_PUBLICATION = 2 
    AND publication_article_ico.PUBLIE_ARTICLE = 1 
    AND publication_article_ico.ID_SECTION = 6  
    AND publication_article_ico.NUMERO_PUBLICATION = 4
     
    ORDER BY article_ico.ID_ARTICLE DESC, IF(media_ico.QUALITE_MEDIA="newsletter", 1, 0) DESC
    Pour un même article, cela devrait t'afficher en premier celui dont le média est "newsletter" (après, lors du parcours des résultats, tu n'affiches que le premier article rencontré).

    Je n'ai pas bien saisi l'intérêt de mettre des LEFT JOIN partout: j'ai donc remplacé les LEFT JOIN par des INNER JOIN.

    Si tu veux vérifier s'il y a des publications qui n'on pas d'article, pas de média ou pas de profil correspondant, il faudra effectivement utiliser des LEFT JOIN et tester au final si ID_PROFIL est NULL (et bien sûr, par de condition WHERE); mais cela constitue un autre traitement (traitement d'intégrité de ta base).

    Voilà.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Par défaut
    Merci bcp pour ta solution !
    J'ai tester avec un article sans média attaché.
    Resultat : Pas d'article...
    J'ai ensuite essayé avec les LEFT JOIN
    Et la le ciel s'est éclaircie.
    Un p'tit GROUP BY sur les article pour n'en avoir qu'un seul meme s'il y a plusieurs média correspondant à ma "sous requéte" et le tour est jouet...

    SELECT article_ico.*, publication_article_ico.*, media_ico.*, profil_ico.*
    FROM article_ico
    LEFT JOIN publication_article_ico ON (article_ico.ID_ARTICLE = publication_article_ico.ID_ARTICLE)
    LEFT JOIN art_media_ico ON (art_media_ico.ID_ARTICLE = article_ico.ID_ARTICLE)
    LEFT JOIN media_ico ON (media_ico.ID_MEDIA = art_media_ico.ID_MEDIA)
    LEFT JOIN profil_ico ON (media_ico.ID_PROFIL = profil_ico.ID_PROFIL)
    WHERE publication_article_ico.ID_PUBLICATION = 2
    AND publication_article_ico.PUBLIE_ARTICLE = 1
    AND publication_article_ico.ID_SECTION = 6
    AND publication_article_ico.NUMERO_PUBLICATION = 4
    GROUP BY article_ico.ID_ARTICLE
    ORDER BY article_ico.ID_ARTICLE DESC,
    IF(media_ico.QUALITE_MEDIA="newsletter", 1, 0) DESC

    MERCI BEAUCOUP !!
    Très, très fort. (le code va etre limpide maintenant...)

    Cedric

  6. #6
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut
    Ok, j'étais pas sûr au niveau des cardinalités (si un article a forcément un média ou non). Je pensais que c'était des cardinalités 1,1 tout le long, mais visiblement c'est des cardinalités 0,1.

    Tant mieux si la solution te convient. Pense à mettre [Résolu] dans le titre du sujet.
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  7. #7
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Par défaut Petite correction
    Citation Envoyé par l_apotre
    Un p'tit GROUP BY sur les article pour n'en avoir qu'un seul meme s'il y a plusieurs média correspondant à ma "sous requéte" et le tour est joué...
    A la réflexion, pas tout à fait car il me semble que le GROUP BY ne garde que la première ligne. Si la première ligne correspond à une qualité "newsletter" ça marche, sinon le résultat risque d'être indéterminé.

    En tout état de cause, le ORDER BY s'effectue après seulement.

    D'après la doc MySQL:

    Citation Envoyé par http://dev.mysql.com/doc/refman/5.1/en/select.html
    If you use GROUP BY, output rows are sorted according to the GROUP BY columns as if you had an ORDER BY for the same columns. MySQL extends the GROUP BY clause so that you can also specify ASC and DESC after columns named in the clause:

    SELECT a, COUNT(b) FROM test_table GROUP BY a DESC
    Donc à mon avis, il vaudrait mieux faire:

    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
    SELECT article_ico.*,   publication_article_ico.*,   media_ico.*,   profil_ico.*
     
    FROM article_ico 
     
    LEFT JOIN publication_article_ico 
    ON (article_ico.ID_ARTICLE = publication_article_ico.ID_ARTICLE) 
     
    LEFT JOIN art_media_ico 
    ON (art_media_ico.ID_ARTICLE = article_ico.ID_ARTICLE) 
     
    LEFT JOIN media_ico 
    ON (media_ico.ID_MEDIA = art_media_ico.ID_MEDIA) 
     
    LEFT JOIN profil_ico 
    ON (media_ico.ID_PROFIL = profil_ico.ID_PROFIL)
     
    WHERE publication_article_ico.ID_PUBLICATION = 2 
    AND publication_article_ico.PUBLIE_ARTICLE = 1 
    AND publication_article_ico.ID_SECTION = 6  
    AND publication_article_ico.NUMERO_PUBLICATION = 4
     
    GROUP BY article_ico.ID_ARTICLE DESC, IF(media_ico.QUALITE_MEDIA="newsletter", 1, 0) DESC
    Ici, le ORDER BY se fait dans le GROUP BY (et on est sûr de garder la ligne qui nous intéresse).
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  8. #8
    Futur Membre du Club
    Inscrit en
    Septembre 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 4
    Par défaut
    Merci pour cette importante précision.
    Longue vie à Developpez.com

    Cédric

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/08/2014, 18h07
  2. Macro qui va chercher des conditions dans une table
    Par piflechien73 dans le forum VBA Access
    Réponses: 5
    Dernier message: 13/09/2009, 22h29
  3. Réponses: 2
    Dernier message: 09/11/2007, 10h18
  4. FONCTION SQL - reconnaissance texte dans une table
    Par dahu17 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 16/03/2007, 11h16
  5. Comment inserer une image dans une table sous sql qerveur
    Par zeddy23 dans le forum Bases de données
    Réponses: 4
    Dernier message: 25/02/2005, 08h51

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