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 MYSQL, un petit casse tête pour moi, peut-être pas pour vous !


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut Requete MYSQL, un petit casse tête pour moi, peut-être pas pour vous !
    Bonjour à tous,

    Je planche depuis un petit moment sur une requete que j'essaye de réaliser. Je vous explique le contexte.

    J'ai deux tables
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    articles        [id,titre,categories]
    categories    [id,nom,flag]
    Je souhaite afficher les articles seulement d'une catégorie. Facile me direz-vous !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $id_categorie
    SELECT * FROM articles WHERE categories = $id_categorie
    Seulement j'aimerai faire un tri sur cette requete suivant le champ flag
    Et là... je suis perdu

    J'ai bien essayé ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $id_categorie
    SELECT * FROM articles AS art,categorie AS cat  WHERE categories = $id_categorie ORDER BY cat.flag
    Mais rien n'y fait...
    J'espère que vous pourrez m'aider. Merci d'avance

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Qu'obtiens-tu, et en quoi est-ce que ça ne correspond pas à ce que tu voulais ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 102
    Points
    102
    Par défaut
    tu fais un tri sur une catégorie, quel est le but ?

  4. #4
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Salut à toi,

    Merci de t'intéresser à mon problème.
    Tout d'abord je tiens à rectifier la requête voulu, il était tard hier soir je me suis un peu tromper dans l'énonciation bon ça ne change pas grand chose si ce n'est qu'il peut y avoir plusieurs types de catégories à sélectionner :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $id_categorie_1
    $id_categorie_2
     
    SELECT * FROM articles AS art,categorie AS cat  WHERE categories LIKE '$id_categorie_1' OR categories LIKE '$id_categorie_2' ORDER BY cat.flag
    Alors j'obtiens comme résultat...

    Chaque articles s'affichent x fois ou x correspond au nombre total d'articles normalement à afficher et l'ordre de tri n'est pas respecté comme je le décris ci-dessous :

    1 XXXXXXXXXX
    1 XXXXXXXXXX
    1 XXXXXXXXXX
    3 RRRRRRRRRRR
    3 RRRRRRRRRRR
    3 RRRRRRRRRRR
    2 DDDDDDDDDD
    2 DDDDDDDDDD
    2 DDDDDDDDDD

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 102
    Points
    102
    Par défaut
    tu as oublié de faire une jointure entre les deux tables, du coup tu as un produit cartésien des deux

  6. #6
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Pour monsieurjean :

    Je souhaite faire un tri sur les catégories pour que certaine catégorie apparaissent en premier...
    Et le champ flag me permet de définir l'ordre que je souhaite donner !

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 102
    Points
    102
    Par défaut
    $id_categorie_1
    $id_categorie_2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM articles AS art,categorie AS cat  
    WHERE categories LIKE '$id_categorie_1' OR categories LIKE '$id_categorie_2' AND articles.categories=categories.id 
    ORDER BY cat.flag

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Il y a seulement les articles de la catégorie 1 qui s'affichent toujours en se multipliant par le nombre d'articles total...

    Halalala je suis mauvais

  9. #9
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Je peux faire une jointure du genre :

    ... categorie.code LIKE '%article.code%' ORDER BY ...

    où une jointure doit être strictement une égalité ?

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 102
    Points
    102
    Par défaut
    une jointure correcte, c'est avec des valeurs numériques

  11. #11
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bon comme je suis un peu pressé par le temps je reviendrais là dessus plus tard...
    Merci pour ton aide monsieur-jean

    J'ai choisi la méthode à l'arrache :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM articles WHERE catégorie LIKE'%+ $categorie_1 +%' 
     
    { ... }
     
    SELECT * FROM articles WHERE catégorie LIKE'%+ $categorie_2 +%'
    { ... }

    Merci je reviendrais avec mon problème promis...
    D'ailleurs voilà pour quoi je bosse : http://www.macommune.info

    Conférence de presse ce matin , tout doit être nickel !
    Merci beaucoup

  12. #12
    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
    Peut-être qu'en inversant les clauses du where et en demandant un distinct ça marcherait mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT * 
    FROM articles AS art,categorie AS cat 
    WHERE articles.categories=categories.id AND categories LIKE '$id_categorie_1' OR categories LIKE '$id_categorie_2' 
    ORDER BY cat.flag
    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 !

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Je peux faire une jointure du genre :

    ... categorie.code LIKE '%article.code%' ORDER BY ...

    où une jointure doit être strictement une égalité ?
    Cette partie de la requête n'as rien à voir avec la jointure, c'est un filtre suplémentaire à la jointure, dans la requete de monsieurjean
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM articles AS art,categorie AS cat 
    WHERE categories LIKE '$id_categorie_1' 
      OR categories LIKE '$id_categorie_2' AND articles.categories=categories.id ORDER BY cat.flag
    la jointure est réalise par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    articles.categories=categories.id
    Que te donne cette requête et que souhaite tu avoir en résultat.

    Pour le LIKE c'est quand tu n'as pas la valeur exacte, je sais pas si c'est le cas, mais faut pas oublier le %
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 424
    Points : 382
    Points
    382
    Par défaut
    Peut-être qu'en inversant les clauses du where
    Ca change rien, le AND est bijectif a ET b est pareil que b ET a
    Si un problème ne trouve pas de solution, c'est qu'il n'y à pas de problème

  15. #15
    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 016
    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 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Voilà un bel exemple de galère due à l'écriture des jointures entre table selon la première norme SQL. En mettant la condition de jointure dans le where, avec d'autres conditions, et en ayant des AND et des OR, ça devient rapidement ingérable.
    Et encore, dans cet exemple, il n'y a que 2 tables...
    Bref, prenez l'habitude d'écrire les jointures selon la norme SQL2, avec les mots clefs INNER JOIN, LEFT JOIN...
    Voilà ce que devient votre requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select *
    from article art
    inner join categorie cat on art.categorie = cat.id
    where cat.id in ($id_categorie_1, $id_categorie_2)
    order by cat.flag
    Je suis parti du principe que l'id de categorie était numérique, si ç n'est pas le cas, il faut mettre des quotes autour des variables PHP...

    C'est pas plus simple ?

    ced
    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

  16. #16
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 15
    Points : 9
    Points
    9
    Par défaut
    Bonsoir à tous,

    Tout d'abord merci pour votre aide et votre participation.
    J'ai essayé de bosser sur la requête proposé par ced. Je pense que c'est la solution.
    Pour être franc je me suis fait prendre à ma propre simplification

    Je me permet de reformuler mon énigme... qui n'est pas très loin de la question initiale mais cela évitera que je me perde.

    Alors j'ai toujours deux tables :

    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
    actualite [id,titre,commune,date]
    
    exemple d'enregistrement de la table actualite
    5, merci de votre aide, +besancon++mulhouse++strasbourg+, 120215458
    6, vraiment cest simpa, +strasbourg+, 120257854
    7, je susi en peu dans la merde, +besancon++marseille++mulhouse+, 125648798
    8, non pas tant que ça mais un peu quan meme, +besancon++mulhouse+,1556878987
    
    communes [id,nom,code,flag]
    
    exemple d'enregistrement de la table communes
    1, Strasbourg, strasbourg, 2
    2, Mulhouse, mulhouse, 2
    3, Besançon, besancon, 1
    4, Marseille, marseille, 2
    5, Aix-en-provence, aixenprovence, 2
    Comme un article peut concerner plusieurs communes j'ai trouver la technique d'enregistrer dans un seul champ, les communes de la manière suivante :

    +besancon++mulhouse++strasbourg

    et pour afficher par exemple seulement les articles concernant Besançon, je fais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM actualite WHERE commune LIKE'%+besancon+%'
    Voilà en gros le contexte...
    Donc mon problème est le suivant :

    Je souhaite afficher grâce à une seule requête tous les articles mais classé par rapport au flag de la table communes.

    Voilà c'est tout simple à dire...

  17. #17
    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 016
    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 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Citation Envoyé par mibolan Voir le message
    J'ai essayé de bosser sur la requête proposé par ced. Je pense que c'est la solution.
    ...moi aussi

    Citation Envoyé par mibolan Voir le message
    Comme un article peut concerner plusieurs communes j'ai trouver la technique d'enregistrer dans un seul champ, les communes de la manière suivante :

    +besancon++mulhouse++strasbourg
    Ca, c'était malheureusement pas une bonne idée. Ca complique énormément les conditions de jointures.
    Normalement, quand on a une relation N-N (un article concerne plusieurs villes et une ville peut être concernée par plusieurs articles), on fait une table de passage avec 2 colonnes : la clef de l'article et la clef des villes qu'il concerne.
    Citation Envoyé par mibolan Voir le message
    Je souhaite afficher grâce à une seule requête tous les articles mais classé par rapport au flag de la table communes.

    Voilà c'est tout simple à dire...
    Bon, alors on recommence :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
    FROM actualite a
    INNER JOIN commune c ON a.commune LIKE CONCAT('%+', c.code, '+%')
    WHERE a.id = ...
    ORDER BY c.flag
    Je n'ai pas testé, mais a ressemble sûrement à quelque chose comme ça.

    Avec une table de passage, ça donnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT *
    FROM actualite a
    INNER JOIN passage p ON a.id = p.id_actualite
    INNER JOIN commune c ON p.id_commune = c.id
    WHERE a.id = ...
    ORDER BY c.flag
    Plus simple, comme requête, non ?

    ced
    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

  18. #18
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par mibolan Voir le message
    Comme un article peut concerner plusieurs communes j'ai trouver la technique d'enregistrer dans un seul champ, les communes de la manière suivante :

    +besancon++mulhouse++strasbourg
    C'est une erreur de modélisation classique... la bonne façon de faire est de rajouter une table actu_communes (idactu, idcomm).
    Citation Envoyé par mibolan Voir le message
    (...)
    Je souhaite afficher grâce à une seule requête tous les articles mais classé par rapport au flag de la table communes.
    Classé par rapport au flag, ça veut bien dire : tous les flag = 1 d'abord, puis tous les flag = 2 ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT A.titre, A.commune, A.date
    FROM actualite A
      INNER JOIN communes C ON A.commune LIKE CONCAT('%', C.nom, '%')
    ORDER BY C.flag
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  19. #19
    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 016
    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 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Ben au moins, on est d'accord

    ced
    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

  20. #20
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par monsieurjean Voir le message
    une jointure correcte, c'est avec des valeurs numériques
    Non, n'importe quelle condition est acceptée dans le ON.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

Discussions similaires

  1. [PHP 5.2] Petit casse-tête pour les amateurs de tableaux
    Par renaud26 dans le forum Langage
    Réponses: 8
    Dernier message: 07/02/2011, 15h25
  2. un petit pas pour vous, un grand pas pour moi!
    Par gerv33 dans le forum Langage
    Réponses: 6
    Dernier message: 01/11/2009, 13h38
  3. Petit casse tête - cp /php
    Par christophev85 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 15/04/2009, 17h25
  4. Réponses: 1
    Dernier message: 10/03/2009, 17h05
  5. Un petit casse-tête de sessions
    Par FrankOVD dans le forum Langage
    Réponses: 22
    Dernier message: 25/09/2006, 18h18

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