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 :

Requête sql et affichage


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Le Néophyte
    Homme Profil pro
    Développeur débutant...
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur débutant...

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Par défaut Requête sql et affichage
    Bonjour à tous,

    J'ai une base "tablematch" avec

    Match Joueur but
    1 marc 1
    2 pierre 3
    3 jean 1
    3 pierre 2
    4 jean 2
    4 pierre 1



    et je voudrait faire une requête sql qui me ressort


    Match But Jean But pierre
    3 1 2
    4 2 1


    en gros je veux

    - Afficher Seulement les matchs en communs pour jean et pierre
    en sql j'arrive seulement à afficher tous les match des deux

    avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select match from tablematch where joueur=jean or joueur=pierre
    qui me sort

    Match Joueur but
    2 pierre 3
    3 jean 1
    3 pierre 2
    4 jean 2
    4 pierre 1

    j'ai beau retourner dans tous les sens avec des distinct, group by, and, or, etc... je n'arrive déjà pas à afficher juste les matchs en communs...

    pouvez vous m'aider ??

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 176
    Par défaut
    Bonsoir,

    Il faut ouvrir 2 fois la table match à l'aide d'une sous-requête corrélée.

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Bonjour,

    Vous pouvez faire quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT 
    	match 
    	,MAX(CASE WHEN joueur = 'jean' THEN but END) as But_jean
    	,MAX(CASE WHEN joueur = 'pierre' THEN but END) as But_pierre
    FROM tablematch 
    WHERE joueur='jean' or joueur='pierre'
    GROUP BY match
    HAVING COUNT(*) = 2

  4. #4
    Membre éclairé Avatar de Le Néophyte
    Homme Profil pro
    Développeur débutant...
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur débutant...

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Par défaut
    Merci à vous !! à quoi sert, ou comment fonctionne HAVING COUNT(*) = 2 ?

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Le Néophyte Voir le message
    Merci à vous !! à quoi sert, ou comment fonctionne "HAVING COUNT(*) = 2" ?
    Vous voulez ceci :
    Citation Envoyé par Le Néophyte
    Afficher Seulement les matchs en communs pour jean et pierre
    La requête de aieeeuuuuu sélectionne alors les matches où figurent les joueurs Jean ou Pierre et comme vous voulez que les deux joueurs soient présents alors il faut que le nombre de lignes retourné par chaque match soit égal au nombre de joueurs voulus, donc 2. C'est le rôle du HAVING COUNT(*) = 2. La clause HAVING est un WHERE qui opère sur le regroupement. Ici, ça se traduit par "ayant un comptage de ligne égal à 2", sous-entendu "par groupement", c'est à dire par match.

    S'il n'y avait pas cette clause, vous auriez aussi les matches où n'est présent que Jean ou que Pierre.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  6. #6
    Membre éclairé Avatar de Le Néophyte
    Homme Profil pro
    Développeur débutant...
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur débutant...

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Par défaut Magnifique
    Super merci pour tout ça fonctionne parfaitement !!!!!!!!!!!!!!!!

    Merci pour les explications !!!

    A bientôt

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut le néophyte.

    Je suis bien sous mysql 5.7.13.

    'match' est un mot réservé !!!
    Il faut soit mettre autre chose comme nom de colonne ou bien mettre cela entre ` (alt + 7).

    J'ai repris ta requête (le première dans mon exemple, sans rien changer. Tu as bien une erreur de syntaxe à cause de ce mot réservé 'match'.
    Et je te donne une solution avec la seconde requête.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `tablematch`
    --------------
     
    --------------
    CREATE TABLE `tablematch`
    ( `id`         integer unsigned NOT NULL auto_increment primary key,
      `match`      varchar(255)     NOT NULL,
      `joueur`     varchar(255)     NOT NULL,
      `but`        tinyint unsigned NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `tablematch` (`match`,`joueur`,`but`) values
      ('match 1', 'marc', 1),('match 2', 'pierre', 3),
      ('match 3', 'jean', 1),('match 3', 'pierre', 2),
      ('match 4', 'jean', 2),('match 4', 'pierre', 1)
    --------------
     
    --------------
    select * from tablematch
    --------------
     
    +----+---------+--------+-----+
    | id | match   | joueur | but |
    +----+---------+--------+-----+
    |  1 | match 1 | marc   |   1 |
    |  2 | match 2 | pierre |   3 |
    |  3 | match 3 | jean   |   1 |
    |  4 | match 3 | pierre |   2 |
    |  5 | match 4 | jean   |   2 |
    |  6 | match 4 | pierre |   1 |
    +----+---------+--------+-----+
    --------------
    SELECT
            match
            ,MAX(CASE WHEN joueur = 'jean' THEN but END) as But_jean
            ,MAX(CASE WHEN joueur = 'pierre' THEN but END) as But_pierre
    FROM tablematch
    WHERE joueur='jean' or joueur='pierre'
    GROUP BY match
    HAVING COUNT(*) = 2
    --------------
     
    ERROR 1064 (42000) at line 50: Erreur de syntaxe près de 'MAX(CASE WHEN joueur = 'jean' THEN but END) as But_jean
            ,MAX(CASE WHEN joueur =' à la ligne 3
    --------------
    SELECT `match`,
           max(case joueur when 'jean'   then but else null end) as 'But Jean',
           max(case joueur when 'pierre' then but else null end) as 'But Pierre'
    FROM   tablematch
    WHERE  joueur in ('jean', 'pierre')
    GROUP  BY `match`
    HAVING COUNT(*) = 2
    --------------
     
    +---------+----------+------------+
    | match   | But Jean | But Pierre |
    +---------+----------+------------+
    | match 3 |        1 |          2 |
    | match 4 |        2 |          1 |
    +---------+----------+------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

  8. #8
    Membre éclairé Avatar de Le Néophyte
    Homme Profil pro
    Développeur débutant...
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur débutant...

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Par défaut
    Merci beaucoup pour la réponse qui a l'air super mais mon tableau est devenu ça depuis :

    id epreuve nom prenom but
    1 match 1 dupont marc 1
    2 match 2 couet pierre 3
    3 match 3 baud jean 1
    4 match 3 couet pierre 2
    5 match 4 baud jean 2
    6 match 4 couet pierre 1


    Du coup j'ai essayé ça mais c'est pas bon apparement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    SELECT `epreuve`,
           max(case when nom = 'baud' and prenom = 'jean' then but else null end) as 'But Jean',
           max(case when nom = 'couet' and prenom = 'pierre' then but else null end) as 'But Pierre'
    FROM   tablematch
    WHERE  nom in ('baud') and prenom in ('jean') or  nom in ('couet') and prenom in ('pierre')
    GROUP  BY `epreuve`
    HAVING COUNT(*) = 2
    Merci encore

  9. #9
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut Le Néophyte.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `tablematch`
    --------------
     
    --------------
    CREATE TABLE `tablematch`
    ( `id`         integer unsigned NOT NULL auto_increment primary key,
      `match`      varchar(255)     NOT NULL,
      `nom`        varchar(255)     NOT NULL,
      `prenom`     varchar(255)     NOT NULL,
      `but`        tinyint unsigned NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `tablematch` (`match`,`nom`,`prenom`,`but`) values
      ('match 1', 'dupond', 'marc',   1),
      ('match 2', 'couet',  'pierre', 3),
      ('match 3', 'baud',   'jean',   1),
      ('match 3', 'couet',  'pierre', 2),
      ('match 4', 'baud',   'jean',   2),
      ('match 4', 'couet',  'pierre', 1)
    --------------
     
    --------------
    select * from tablematch
    --------------
     
    +----+---------+--------+--------+-----+
    | id | match   | nom    | prenom | but |
    +----+---------+--------+--------+-----+
    |  1 | match 1 | dupond | marc   |   1 |
    |  2 | match 2 | couet  | pierre |   3 |
    |  3 | match 3 | baud   | jean   |   1 |
    |  4 | match 3 | couet  | pierre |   2 |
    |  5 | match 4 | baud   | jean   |   2 |
    |  6 | match 4 | couet  | pierre |   1 |
    +----+---------+--------+--------+-----+
    --------------
    SELECT `match`,
           max(case when nom = 'couet' and prenom = 'pierre' then but else null end) as 'But Couet Pierre',
           max(case when nom = 'baud'  and prenom = 'jean'   then but else null end) as 'But Baud Jean'
    FROM   tablematch
    WHERE  (nom,prenom) in (('couet','pierre'), ('baud','jean'))
    GROUP  BY `match`
    HAVING COUNT(*) = 2
    --------------
     
    +---------+------------------+---------------+
    | match   | But Couet Pierre | But Baud Jean |
    +---------+------------------+---------------+
    | match 3 |                2 |             1 |
    | match 4 |                1 |             2 |
    +---------+------------------+---------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+

  10. #10
    Membre éclairé Avatar de Le Néophyte
    Homme Profil pro
    Développeur débutant...
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur débutant...

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Par défaut
    Merci pour la réponse, donc cela fonctionne si j'enlève HAVING COUNT(*) = 2
    Curieux ça doit être ma configuration...
    Sauf que chez OVH on ne peut plus modifier quoi que ce soit...

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut Le Néophyte.

    Citation Envoyé par Le Néophyte
    cela fonctionne si j'enlève HAVING COUNT(*) = 2
    Non, le "having count(*) = 2" a son utilité.

    Tu désires récupérer les personnes se nommant "Baud Jean" ET "Couet Pierre", est-ce bien cela ?

    Donc tu as deux cas qui peuvent se présenter :
    1) soit les deux joueurs à la fois.
    2) soit l'un, soit l'autre mais pas les deux à la fois.

    Si tu précises le "having count(*) = 2", tu auras que le cas 1) et seulement ce cas là.
    Si tu ne mets rien, tu auras les deux cas.

    Citation Envoyé par Le Néophyte
    Sauf que chez OVH on ne peut plus modifier quoi que ce soit...
    Je ne comprends pas le sens de ta phrase.

    @+

  12. #12
    Membre éclairé Avatar de Le Néophyte
    Homme Profil pro
    Développeur débutant...
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur débutant...

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Par défaut
    Non en fait j'ai toutes les courses si j'enlève having
    (oui oui bien sur j'ai compris l'utilité)
    si je le laisse rien ne s'affiche

    En gros je pense que having bloque la requête, j'ai lu qu'il fallait changer la configuration du serveur MYSQL pour que cela fonctionne mais pour moi impossible...

  13. #13
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut Le Néophyte.

    Tu voies bien que dans l'exemple que je t'ai donné, j'ai mis le "having count(*) = 2" et cela produit les lignes que tu recherches.
    Si tu le supprimes, tu as cela :
    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
    --------------
    SELECT epreuve,
           max(case when nom = 'couet' and prenom = 'pierre' then but else null end) as 'But Couet Pierre',
           max(case when nom = 'baud'  and prenom = 'jean'   then but else null end) as 'But Baud Jean'
    FROM   tablematch
    WHERE  (nom,prenom) in (('couet','pierre'), ('baud','jean'))
    GROUP  BY epreuve
    --------------
     
    +---------+------------------+---------------+
    | epreuve | But Couet Pierre | But Baud Jean |
    +---------+------------------+---------------+
    | match 2 |                3 |          NULL |
    | match 3 |                2 |             1 |
    | match 4 |                1 |             2 |
    +---------+------------------+---------------+
    C'est bien conforme à ce que je t'ai dit précédemment.

    La ligne "match 2" ne doit pas apparaître car ce n'est pas une rencontre avec le joueur "Baud Jean".

    Si rien ne sort, c'est que tu as une erreur dans la retranscription de ta requête.
    Une majuscule alors qu'il faut une minuscule dans les noms et prénoms des joueurs ou bien une faute d'orthographe sur l'un deux.
    Tu n'as aucun match qui correspond à ce que tu recherches, à savoir la rencontre de tes deux joueurs.

    @+

  14. #14
    Membre éclairé Avatar de Le Néophyte
    Homme Profil pro
    Développeur débutant...
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur débutant...

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Par défaut
    Oui merci pour la réponse

    Je le répète j'ai bien compris tout cela,
    quand j'écrit ta requête, ça retourne un résultat vide, quand j'enlève juste la ligne having, ça m'affiche toutes les courses pas que celle en communs(je que je cherche à faire)
    donc en effet je ne comprend pas...

  15. #15
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut Le Néophyte.

    J'ai bien compris ton problème !

    Je ne connais pas ton jeu d'essai, ni comment tu le testes et encore moins dans quel environnement tu te trouves.
    La solution que je t'ai donné fonctionne parfaitement. D'ailleurs sur le petit jeu d'essai que tu m'as donné, la requête produit ce que tu attends.

    A toi de reconstruire cette requête morceau par morceau jusqu'à ce que tu trouves l'erreur que tu as commise.

    Citation Envoyé par Le Néophyte
    quand j'écrit ta requête, ça retourne un résultat vide, quand j'enlève juste la ligne having, ça m'affiche toutes les courses pas que celle en communs
    D'après ce que j'ai compris, tu es sous MySql 5.7, comme moi (mysql 5.7.13).
    J'ai testé ta requête dans la même version mysql que toi.
    J'ai corrigé ton problème avec une solution qui ne donne aucune ambiguïté sur le résultat produit.

    J'ignore comment tu testes la requête, ni dans quel environnement (php, phpmyadmin, console mysql ...).

    Tu as commis une erreur de retranscription dans la requête et tu me demandes laquelle.
    De plus, tu me dis que cela ne fonctionne pas et je n'ai aucun résultat pour vérifier tes dires.
    Alors je fais comment ? Je regarde dans ma boule de cristal ?
    Je ne suis pas devin et je ne peux pas savoir ce que tu fais derrière ton écran.

    @+

  16. #16
    Membre éclairé Avatar de Le Néophyte
    Homme Profil pro
    Développeur débutant...
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur débutant...

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Par défaut
    Merci de ta réponse !!

    j'ai l'impression de t'agacer dans ta dernière réponse ?
    Je n'ai rien dit de mal !!

    Bon j'ai compris mon erreur de retranscription,

    en fait dans mon tableau il y a des lignes en plus (que je n'ai pas mis pour facilité la compréhension de ma demande) mais apparement c'est elle qui font bouger :

    Donc j'ai en plus dans mes lignes : "date", "lieu", et un order

    que je rajoute dans le select, quand je les enlève tout fonctionne avec ton code


    Voici mon code qui ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    SELECT `epreuve`, `date`, `lieu`, 
           max(case when nom = 'couet' and prenom = 'pierre' then but else null end) as 'But Couet Pierre',
           max(case when nom = 'baud'  and prenom = 'jean'   then but else null end) as 'But Baud Jean'
    FROM   tablematch
    WHERE  (nom,prenom) in (('couet','pierre'), ('baud','jean'))
    GROUP  BY `epreuve`, 
    HAVING COUNT(*) = 2
    ORDER BY date DESC, epreuve


    Merci encore

  17. #17
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut Le Néophyte.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `tablematch`
    --------------
     
    --------------
    CREATE TABLE `tablematch`
    ( `id`         integer unsigned NOT NULL auto_increment primary key,
      `epreuve`    varchar(255)     NOT NULL,
      `date`       date             NOT NULL,
      `lieu`       varchar(255)     NOT NULL,
      `nom`        varchar(255)     NOT NULL,
      `prenom`     varchar(255)     NOT NULL,
      `but`        tinyint unsigned NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `tablematch` (`epreuve`,`date`,`lieu`,`nom`,`prenom`,`but`) values
      ('match 1', '2016-06-13', 'lieu 1', 'dupond', 'marc',   1),
      ('match 2', '2016-06-11', 'lieu 2', 'couet',  'pierre', 3),
      ('match 3', '2016-06-10', 'lieu 3', 'baud',   'jean',   1),
      ('match 3', '2016-06-10', 'lieu 3', 'couet',  'pierre', 2),
      ('match 4', '2016-06-09', 'lieu 4', 'baud',   'jean',   2),
      ('match 4', '2016-06-09', 'lieu 4', 'couet',  'pierre', 1)
    --------------
     
    --------------
    select * from tablematch
    --------------
     
    +----+---------+------------+--------+--------+--------+-----+
    | id | epreuve | date       | lieu   | nom    | prenom | but |
    +----+---------+------------+--------+--------+--------+-----+
    |  1 | match 1 | 2016-06-13 | lieu 1 | dupond | marc   |   1 |
    |  2 | match 2 | 2016-06-11 | lieu 2 | couet  | pierre |   3 |
    |  3 | match 3 | 2016-06-10 | lieu 3 | baud   | jean   |   1 |
    |  4 | match 3 | 2016-06-10 | lieu 3 | couet  | pierre |   2 |
    |  5 | match 4 | 2016-06-09 | lieu 4 | baud   | jean   |   2 |
    |  6 | match 4 | 2016-06-09 | lieu 4 | couet  | pierre |   1 |
    +----+---------+------------+--------+--------+--------+-----+
    --------------
    SELECT epreuve, date, lieu,
           max(case when nom = 'couet' and prenom = 'pierre' then but else null end) as 'But Couet Pierre',
           max(case when nom = 'baud'  and prenom = 'jean'   then but else null end) as 'But Baud Jean'
    FROM   tablematch
    WHERE  (nom,prenom) in (('couet','pierre'), ('baud','jean'))
    GROUP  BY epreuve, date, lieu
    HAVING COUNT(*) = 2
    order by date desc, epreuve
    --------------
     
    +---------+------------+--------+------------------+---------------+
    | epreuve | date       | lieu   | But Couet Pierre | But Baud Jean |
    +---------+------------+--------+------------------+---------------+
    | match 3 | 2016-06-10 | lieu 3 |                2 |             1 |
    | match 4 | 2016-06-09 | lieu 4 |                1 |             2 |
    +---------+------------+--------+------------------+---------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Attention. Pour un même match donné, tu dois avoir le même "lieu" et la même "date".
    Si ce n'est pas le cas, la requête ne fonctionnera pas.

    Le mieux est de créer une nouvelle table contenant toutes ces répétitions qui n'ont pas lieu d'être dans la table "tablematch".
    Ensuite, tu verras une jointure entre ces deux tables pour récupérer ce dont tu as besoin.

    Bonne nuit !

    @+

  18. #18
    Membre éclairé Avatar de Le Néophyte
    Homme Profil pro
    Développeur débutant...
    Inscrit en
    Mars 2013
    Messages
    60
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur débutant...

    Informations forums :
    Inscription : Mars 2013
    Messages : 60
    Par défaut
    BRAVO !!!

    Un grand merci à toi !!!

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

Discussions similaires

  1. Requête SQL et Affichage
    Par CedriZero dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 07/09/2012, 10h09
  2. [MySQL] Simplifier une requête sql et affichage dans un tableau
    Par Debutant10 dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 01/05/2012, 14h36
  3. [MySQL] Affichage résultat requête SQL dans page HTML comme un tableau
    Par joxbl dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 14/03/2011, 14h26
  4. Requète SQL et affichage liste
    Par Little_flower dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 18/07/2008, 13h33
  5. affichage requête sql sous phppgadmin
    Par kerzut dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 25/02/2005, 12h39

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