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

PHP & Base de données Discussion :

Doublons dans une requête [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Femme Profil pro
    piano
    Inscrit en
    Décembre 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : piano
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2011
    Messages : 131
    Points : 65
    Points
    65
    Par défaut Doublons dans une requête
    Bonjour,
    Je reviens vers vous pour le même projet mais pour un autre problème.
    Ma première page envoie les bonnes infos à la deuxième, mais sur celle-ci la requête m'affiche des doublons que j'aimerais éviter !

    Nom : Sans titre.jpg
Affichages : 130
Taille : 68,5 Ko

    J'ai regardé sur le forum et dans plusieurs tutos, il est préconisé d'utiliser DISTINCT, mais si je l'utilise, ma requête est vide,

    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
     
    $sql = "SELECT
    		IDNPlace,
    		NumPlace,
    		Reférence,
    		Personnes.IDPersonne,
    		Personnes.Nom_Personne,
    		Personnes.Prenom_Personne,
    		Personnes.Paiement,
    		Personnes.Motet,
    		Instruments.Instrument,
    		Concert.titreconcert,
    		Concert.lieu,
    		DATE_FORMAT ( Concert.dateconcert, '%d/%m/%Y' ) AS datecon,
    		Zones.Zone,
    		Prix.Prix
    		FROM Tab_NumPlace
     
    		INNER JOIN Personnes ON Tab_NumPlace.IDPersonne = Personnes.IDPersonne
    		INNER JOIN Instruments ON Personnes.IDInstruments = Instruments.IDInstruments
    		INNER JOIN Concert ON Tab_NumPlace.IDconcert = Concert.IDconcert 
    		INNER JOIN Zones ON Tab_NumPlace.IDZone = Zones.IDZone 
    		INNER JOIN Prix ON Zones.IDPrix = Prix.IDPrix
     
    		WHERE Tab_NumPlace.IDconcert  = '". $idpm ."'
     
    		ORDER BY Personnes.Nom_Personne, Personnes.Prenom_Personne ASC";
    Si dans phpmyadmin je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT `IDPersonne` FROM `Tab_NumPlace` WHERE `IDconcert` ='1'
    je n'a pas de doublons mais si j'essaie avec les jointures j'ai des messages d'erreur

    Voici le message d'erreur de phpmyadmin:

    Erreur
    Analyse statique :

    2 erreurs trouvées lors de l'analyse.

    Mot clé non reconnu. (near "DISTINCT" at position 341)
    Jeton inattendu. (near "IDPersonne" at position 350)
    Requête SQL : Documentation

    SELECT IDNPlace, NumPlace, Reférence, Personnes.IDPersonne, Personnes.Nom_Personne, Personnes.Prenom_Personne, Personnes.Paiement, Personnes.Motet, Instruments.Instrument, Concert.titreconcert, Concert.lieu, DATE_FORMAT ( Concert.dateconcert, '%d/%m/%Y' ) AS datecon, Zones.Zone, Prix.Prix DISTINCT IDPersonne FROM Tab_NumPlace INNER JOIN Personnes ON Tab_NumPlace.IDPersonne = Personnes.IDPersonne INNER JOIN Instruments ON Personnes.IDInstruments = Instruments.IDInstruments INNER JOIN Concert ON Tab_NumPlace.IDconcert = Concert.IDconcert INNER JOIN Zones ON Tab_NumPlace.IDZone = Zones.IDZone INNER JOIN Prix ON Zones.IDPrix = Prix.IDPrix WHERE Tab_NumPlace.IDconcert = '1' ORDER BY Personnes.Nom_Personne, Personnes.Prenom_Personne ASC

    MySQL a répondu: Documentation

    #1064 - Erreur de syntaxe près de 'DISTINCT IDPersonne
    FROM Tab_NumPlace

    INNER JOIN Personnes ON Tab_NumP' à la ligne 16


    Merci d'avance pour votre aide et bon week-end

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Si l'on a plusieurs lignes mais qu'on en veut qu'une ... il faudra choisir ou revoir sa requête ...

    ex : si je prends une commande avec n_commande = 1

    table commande
    n_commande / nom_commande
    -----------------------------
    1 / chouette une commande
    si je prends le détail commande avec n_commande = 1, en supposant qu'il y a 2 lignes 11 et 12

    table detcommande
    n_commande / N_det
    ------------------
    1 / 11
    1 / 12
    si je sélectionne les lignes "détail commande" et que je veux le nom de la commande
    je fais par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select  commande.n_commande,  commande.nom_commande, detcommande.n_det from commande inner join detcommande 
    on commande.n_commande = detcommande.n_commande
    j'obtiens
    commande.n_commande / commande.nom_commande / detcommande.n_det
    1 / chouette une commande / 11
    1 / chouette une commande / 12
    maintenant si je ne veux qu'une ligne ... alors il me faudra regrouper des champs et utiliser un GROUP BY
    mais pour 11 et 12 je vais perdre une de mes informations car je devrai choisir par exemple le max entre 11 et 12 ou une autre fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select  commande.n_commande,  commande.nom_commande, max(detcommande.n_det) from commande inner join detcommande 
    on commande.n_commande = detcommande.n_commande  
    group by commande.n_commande,  commande.nom_commande
    j'obtiens
    commande.n_commande / commande.nom_commande / max(detcommande.n_det)
    1 / chouette une commande / 12
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Membre du Club
    Femme Profil pro
    piano
    Inscrit en
    Décembre 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : piano
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2011
    Messages : 131
    Points : 65
    Points
    65
    Par défaut
    Merci pour ta réponse, hélas après avoir essayé de plusieurs façons, mon tableau est vide

    voici mon dernier essai :

    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
    $sql = "SELECT
    		IDNPlace,
    		NumPlace,
    		Reférence,
    		Personnes.IDPersonne,
    		Personnes.Nom_Personne,
    		Personnes.Prenom_Personne,
    		Personnes.Paiement,
    		Personnes.Motet,
    		Instruments.Instrument,
    		Concert.titreconcert,
    		Concert.lieu,
    		DATE_FORMAT ( Concert.dateconcert, '%d/%m/%Y' ) AS datecon,
    		Zones.Zone,
    		Prix.Prix
    		
    max(Tab_NumPlace.IDNPlace)
    		
    		FROM Tab_NumPlace
    		
    		INNER JOIN Personnes ON Tab_NumPlace.IDPersonne = Personnes.IDPersonne
    		INNER JOIN Instruments ON Personnes.IDInstruments = Instruments.IDInstruments
    		INNER JOIN Concert ON Tab_NumPlace.IDconcert = Concert.IDconcert 
    		INNER JOIN Zones ON Tab_NumPlace.IDZone = Zones.IDZone 
    		INNER JOIN Prix ON Zones.IDPrix = Prix.IDPrix
    		
    group by Tab_NumPlace.IDNPlace, Tab_NumPlace.IDPersonne
    				
    		WHERE Tab_NumPlace.IDconcert  = '". $idpm ."'
    		
    		ORDER BY Personnes.Nom_Personne, Personnes.Prenom_Personne ASC";
    J'ai mis en rouge les lignes que j'ai ajoutées. Si je les enlève mon tableau est rempli mais avec des doublons, si je les mets il est vide.

    Je suis consciente d'avoir fait une erreur, mais mes connaissances étant limitées, je n'arrive pas à voir où.

    Merci d'avance pour votre aide toujours précieuse et bon dimanche

  4. #4
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    SELECT
    IDNPlace,
    NumPlace,
    Reférence,
    Personnes.IDPersonne,
    Personnes.Nom_Personne,
    Personnes.Prenom_Personne,
    Personnes.Paiement,
    Personnes.Motet,
    Instruments.Instrument,
    Concert.titreconcert,
    Concert.lieu,
    DATE_FORMAT ( Concert.dateconcert, '%d/%m/%Y' ) AS datecon,
    Zones.Zone,
    Prix.Prix, Attention déjà ici il manquait une virgule
    max(Tab_NumPlace.IDNPlace)
    ...
    ceci implique un group by sur tous ces champs
    ...
    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
    GROUP BY
    		IDNPlace,
    		NumPlace,
    		Reférence,
    		Personnes.IDPersonne,
    		Personnes.Nom_Personne,
    		Personnes.Prenom_Personne,
    		Personnes.Paiement,
    		Personnes.Motet,
    		Instruments.Instrument,
    		Concert.titreconcert,
    		Concert.lieu,
    		DATE_FORMAT ( Concert.dateconcert, '%d/%m/%Y' ) AS datecon,
    		Zones.Zone,
    		Prix.Prix
    sauf ceux où on passe une fonction de regroupement : min, max, count, sum etc.
    C'est le cas ici de Tab_NumPlace.IDNPlace car ce champs est dans une fonction : max(Tab_NumPlace.IDNPlace)


    en résumé ... tester



    $sql = "SELECT
    IDNPlace,
    NumPlace,
    Reférence,
    Personnes.IDPersonne,
    Personnes.Nom_Personne,
    Personnes.Prenom_Personne,
    Personnes.Paiement,
    Personnes.Motet,
    Instruments.Instrument,
    Concert.titreconcert,
    Concert.lieu,
    DATE_FORMAT ( Concert.dateconcert, '%d/%m/%Y' ) AS datecon,
    Zones.Zone,
    Prix.Prix,
    max(Tab_NumPlace.IDNPlace)

    FROM Tab_NumPlace

    INNER JOIN Personnes ON Tab_NumPlace.IDPersonne = Personnes.IDPersonne
    INNER JOIN Instruments ON Personnes.IDInstruments = Instruments.IDInstruments
    INNER JOIN Concert ON Tab_NumPlace.IDconcert = Concert.IDconcert
    INNER JOIN Zones ON Tab_NumPlace.IDZone = Zones.IDZone
    INNER JOIN Prix ON Zones.IDPrix = Prix.IDPrix

    group by
    IDNPlace,
    NumPlace,
    Reférence,
    Personnes.IDPersonne,
    Personnes.Nom_Personne,
    Personnes.Prenom_Personne,
    Personnes.Paiement,
    Personnes.Motet,
    Instruments.Instrument,
    Concert.titreconcert,
    Concert.lieu,
    DATE_FORMAT ( Concert.dateconcert, '%d/%m/%Y' ) AS datecon,
    Zones.Zone,
    Prix.Prix

    WHERE Tab_NumPlace.IDconcert = '". $idpm ."'

    ORDER BY Personnes.Nom_Personne, Personnes.Prenom_Personne ASC";
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  5. #5
    Membre du Club
    Femme Profil pro
    piano
    Inscrit en
    Décembre 2011
    Messages
    131
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Suisse

    Informations professionnelles :
    Activité : piano
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Décembre 2011
    Messages : 131
    Points : 65
    Points
    65
    Par défaut
    Voilà, j'ai fini par trouver, j'ai fait :

    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
    $sql = "SELECT
    		IDNPlace,
    		NumPlace,
    		Reférence,
    		Personnes.IDPersonne,
    		Personnes.Nom_Personne,
    		Personnes.Prenom_Personne,
    		Personnes.Paiement,
    		Personnes.Motet,
    		Instruments.Instrument,
    		Concert.titreconcert,
    		Concert.lieu,
    		DATE_FORMAT ( Concert.dateconcert, '%d/%m/%Y' ) AS datecon,
    		Zones.Zone,
    		Prix.Prix
    		
    		FROM Tab_NumPlace
    		
    		INNER JOIN Personnes ON Tab_NumPlace.IDPersonne = Personnes.IDPersonne
    		INNER JOIN Instruments ON Personnes.IDInstruments = Instruments.IDInstruments
    		INNER JOIN Concert ON Tab_NumPlace.IDconcert = Concert.IDconcert 
    		INNER JOIN Zones ON Tab_NumPlace.IDZone = Zones.IDZone 
    		INNER JOIN Prix ON Zones.IDPrix = Prix.IDPrix
    		
    		WHERE Tab_NumPlace.IDconcert  = '". $idpm ."'
    		GROUP BY IDPersonne
    		ORDER BY Personnes.Nom_Personne, Personnes.Prenom_Personne ASC";
    et maintenant je n'ai plus de doublons dans mon tableau

    Je vais pouvoir passer à la suite, et c'est plus compliqué alors peut-être à bientôt

    Merci à tous ceux qui ont bien voulu me lire et m'aider bon dimanche

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

Discussions similaires

  1. Eviter les doublons dans une requête.
    Par Smint dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 22/03/2017, 16h17
  2. Réponses: 1
    Dernier message: 23/09/2009, 15h38
  3. Fusionner sans doublons dans une requète
    Par Michaël HENNEQUIN dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 19/02/2009, 16h27
  4. Problème de doublons dans une requète complexe
    Par noakiss dans le forum Langage SQL
    Réponses: 7
    Dernier message: 20/03/2008, 09h19
  5. Doublons dans une requète complexe
    Par noakiss dans le forum VBA Access
    Réponses: 0
    Dernier message: 19/03/2008, 15h30

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