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 :

Requête MYSQL Sans doublons.


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 75
    Par défaut Requête MYSQL Sans doublons.
    Bonjour à tous,
    J'ai créée une requête MYSQL dans un fichier PHP qui fonctionne mais pas comme je le souhaiterais.
    Avec la requête ci-dessous, je n'arrive pas avoir une liste sans doublons...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $select = $bddf->prepare('SELECT *
            FROM ship
            JOIN ship_variant ON ship_variant.id_ship = ship.id_ship
            ORDER BY name_ship, name_variant ASC');
          $select->execute();
    J'ai essayé avec cette requête là, mais sans succès :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $select = $bddf->prepare('SELECT DISTINCT *
            FROM ship
            JOIN ship_variant ON ship_variant.id_ship = ship.id_ship
            ORDER BY name_ship, name_variant ASC');
          $select->execute();
    J'ai une table ship => id_ship | name_ship | id_maker ,
    et une table ship_variant => id_variant | id_ship | name_variant | id_member

    j'aimerai que chaque combo ship et ship_variant unique s'affiche dans la mesure du possible.
    Malheureusement, je n'y arrive pas même après des heures de réflexion. J'ai l'impression de passer à coté de quelque chose sans trouver.
    Une âme charitable pourrait-elle m'aider à résoudre ce problème?

    Cordialement.

    Ps: s'il y a besoin d'informations supplémentaires, pas de soucis.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Avec DISTINCT * tu dédoublonnes tes lignes complètes, les id_member & cie viennent sûrement fausser l'attendu

    => Liste les colonnes que tu souhaites obtenir dédoublonnées
    => Utilise-les dans ton DISTINCT

    Ex. :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT name_ship, name_variant
    FROM ship INNER JOIN ship_variant USING (id_ship)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 75
    Par défaut
    Bonsoir Séb,

    Merci de se pencher sur mon soucis

    J'ai transposé votre exemple dans mon code, j'ai bien aucun doublon, ce qui est positif.
    Cependant, j'ai aussi besoin du champ id_variant de la table ship_variant pour l'exécution de mon code.
    Est-il possible de placer 2 champs dans USING? Le résultat n'a pas été concluant de mon coté
    De plus, je ne trouve pas de référence INNER JOIN avec USING.

    Je vous mets le code PHP ci-dessous:
    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
    <?php
    else if ($_GET['action'] == 'modifyanddelete_ship') {
          $select = $bddf->prepare('SELECT DISTINCT name_ship, name_variant
            FROM ship
            INNER JOIN ship_variant USING (id_ship)
            ORDER BY name_ship, name_variant ASC');
          $select->execute();
     
          // Début de la boucle
          echo '<div id="admin-block_container" class="position-modifyanddelete-ship">';
     
          while ($s = $select->fetch(PDO::FETCH_OBJ)) {
     
            $ship_me = $s->name_ship; 
            $variant_me = $s->name_variant; 
            //var_dump($s->id_variant);
     
            $src_ships = '../admin/imgs/ships/';
            $src_default = '../admin/imgs/default/default.png';
            $filename_ship = $src_ships . $ship_me . '.png';
     
            echo '<div id="admin-block-ship" class="admin-ship">';
            echo '<table id="table-admin-ship">';
     
            if (empty($variant_me) or $variant_me == 'Base' or $ship_me == $variant_me) {
              echo '<tr>';
     
              if (file_exists($filename_ship)) {
                echo '<td id="td-img-ship" colspan="2"><img class="img-ship" src="' . $filename_ship . '" title="' . $ship_me . '" /></td>';
              } else {
                echo '<td id="td-img-ship" colspan="2"><img class="img-ship" src="' . $src_default . '" title="Visuel par défaut" /></td>';
              }
              echo '</tr>';
            } else {
              $ship_final = $ship_me . ' ' . $variant_me;
              $filename_variant = $src_ships . ucwords($ship_final) . '.png';
     
              echo '<tr>';
     
              if (file_exists($filename_variant)) {
                echo '<td id="td-img-ship" colspan="2"><img class="img-ship" src="' . $filename_variant . '" title="' . $ship_final . '" /></td>';
              } else {
                echo '<td id="td-img-ship" colspan="2"><img class="img-ship" src="' . $src_default . '" title="Visuel par défaut" /><!--<a href="#">' . $filename_variant . '</a>--!></td>';
              }
              echo '</tr>';
            }
     
            echo '<tr id="tr-admin-ship">';
            echo '<td colspan="2">';
     
            if (!empty($variant_me)) {
              echo ucwords($ship_me) . ' ' . $variant_me;
            } else {
              echo ucwords($ship_me);
            }
            echo '</td>';
            echo '</tr>';
          ?>
     
            <tr id="tr-admin-edit">
              <td id="admin-edit-img" align="center"><a href="?action=modify_ship&amp;id=<?php echo $s->id_variant; ?>" title=""><img src="./imgs/img_site/edit_1.png" title="Modifier" height="20px" /></a></td>
              <td id="admin-delete-img" align="center"><a href="?action=delete_ship&amp;id=<?php echo $s->id_variant; ?>" title=""><img src="./imgs/img_site/cross.png" title="Supprimer" height="20px" /></a></td>
            </tr>
     
          <?php
            echo '</table>';
            echo '</div>';
          }
          echo '</div>';
          // Fin de la boucle
        }
    ?>

  4. #4
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Rajoute les colonnes nécessaires à ton SELECT.

    Tu peux spécifier plusieurs colonnes dans ton USING, mais elles doivent avoir le même nom dans tes deux tables.
    Ça n'en demeure pas moins un critère de jointure, il s'agit essentiellement d'un raccourci. Dans le même esprit il y a aussi NATURAL JOIN.
    Doc qui explique tout cela : https://dev.mysql.com/doc/refman/8.0/en/join.html

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 75
    Par défaut
    En ajoutant un champ dans mon SELECT
    ex:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT name_ship, name_variant, id_variant
    FROM ship INNER JOIN ship_variant USING (id_ship)

    Je n'ai plus la suppression des doublons, car il peut arriver, dans ma table MYSQL, qu'il y ait un combo avec le même name_ship et name_variant, mais avec un id_variant_different suivant le membre (une usine à gaz lol)
    ex:

    name_ship name_variant id_variant
    Hornet F7C M Heartseeker 2
    Hornet F7C M Heartseeker 31

    Il faudrait que je puisse appeler id_variant sans le nommer avec SELECT DISTINCT.
    De plus, lorsque j'écris

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT name_ship, name_variant, id_variant
    FROM ship INNER JOIN ship_variant USING (id_ship, id_variant)
    , ma page PHP devient vide.

    Je demande peut être l'impossible.

  6. #6
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Si tes id_variant sont différents tes lignes ne sont pas en doublon.

    Sinon tu peux faire un GROUP_CONCAT() sur id_variant et un GROUP BY sur tes colonnes name_ship et ship_variant.

    Si ça ne te convient pas donne un exemple concret du résultat SQL attendu, et de ce que tu veux en faire.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 75
    Par défaut
    Bonjour Séb,

    Vous avez raison, les id_variant n'ont pas de doublons, ce qui me pose justement un soucis, car cela affiche toute les id_variant.
    Je dois mal présenter le soucis à mon avis, pour moi c'est simple, mais j'ai a peu de mal à le coucher en message.

    Pour GROUP_CONCAT(), j'essaye de comprendre le fonctionnement.

    J'ai ma table ship_variant comme ci-dessous:

    Nom : img1.png
Affichages : 159
Taille : 17,7 Ko

    Avec ma requête MYSQL initiale:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM ship
    JOIN ship_variant ON ship_variant.id_ship = ship.id_ship
    ORDER BY name_ship, name_variant ASC

    Mon code PHP me retourne:
    Nom : img2.PNG
Affichages : 156
Taille : 67,2 Ko
    avec un doublon du à l'id_variant différent lié à l'appartenance d'un membre.

    Avec la requête que vous m'avez présenté:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT DISTINCT name_ship, name_variant
    FROM ship INNER JOIN ship_variant USING (id_ship)

    Le résultat visuel est celui que j'attends car il n'y a plus de doublons.
    Néanmoins, J'ai cette erreur que s'affiche, car dans mon code aux lignes 61 et 62 du message montrant mon code PHP, j'ai besoin d'utiliser le champ id_variant.

    ( ! ) Notice: Undefined property: stdClass::$id_variant
    Je n'ai besoin au final du SELECT DISTINCT que sur les champs name_ship et name_variant. Mais en parallèle j'ai besoin du champ id_variant pour l'utiliser dans mon code.

    Je suis désolé pour le pavé, j'espère avoir été le plus précis possible dans ce message.

    Cordialement.

  8. #8
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    Tu perds de vue qu'on parle SQL et données tabulaires pures. Pour le moment le rendu ne nous intéresse pas.

    "Donne le résultat attendu"
    Il nous faut les lignes et les colonnes du résultat attendu, qu'on voit exactement ce que tu as en tête

    "Je n'ai besoin au final du SELECT DISTINCT que sur les champs name_ship et name_variant."
    Cela renforce le GROUP BY / GROUP_CONCAT().

    "Mais en parallèle j'ai besoin du champ id_variant pour l'utiliser dans mon code."
    Pas clair tout ça. Quel est l'objectif de la page ? Pour le moment je comprends que tu as une table de modèles de vaisseaux (ship) et une table listant les vaisseaux d'un joueur (ship_variant) avec un champ permettant une personnalisation du nom (name_variant). Sur ta capture on voit des icones EDIT et DELETE, un clique sur DELETE supprime quoi ? Le vaisseau d'un joueur ou un modèle de vaisseau ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 75
    Par défaut
    Le résultat attendu est qu'aucun doublon n'apparaisse, avec l'association des champs name_ship et name_variant, comme le fait très bien la requête proposée.
    C'est l'erreur qui en découle qui me perturbe.
    Afin de de modifier ou supprimer la bonne variante, je me sers de l'id_variante.

    Plus le temps passe et plus je m'y perds.

    Pour la proposition avec GROUP_CONCAT(), j'ai fais des tests, mais je dois mal l'appliquer:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT
        id_variant,
        GROUP_CONCAT(name_ship, name_variant SEPARATOR " ")
    FROM
        ship
    INNER JOIN ship_variant USING(id_ship)
    ORDER BY
        name_ship,
        name_variant ASC

  10. #10
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 313
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 313
    Billets dans le blog
    17
    Par défaut
    "Le résultat attendu est qu'aucun doublon n'apparaisse"
    Bon, et en plus tu ne réponds pas aux autres questions. Sans plus d'infos je laisse tomber. Bon courage,

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 75
    Par défaut
    Citation Envoyé par Séb. Voir le message
    en plus tu ne réponds pas aux autres questions
    Je pensais avoir répondu aux 3 points que vous aviez posées, je n'avais pas les dernières, désolé.

    Quel est l'objectif de la page ? Pour le moment je comprends que tu as une table de modèles de vaisseaux (ship) et une table listant les vaisseaux d'un joueur (ship_variant) avec un champ permettant une personnalisation du nom (name_variant). Sur ta capture on voit des icones EDIT et DELETE, un clique sur DELETE supprime quoi ? Le vaisseau d'un joueur ou un modèle de vaisseau ?
    L'objectif de la page est de pouvoir lister tout les modèles (variantes) existant dans la base de données, puis pouvoir modifier chaque variante dans une autre page, avec des informations liées au prix, l'image, et d'autres informations sur les modèles.
    J'ai voulu centralisé les variantes existants et celles obtenues par les membres, c'est peut être une erreur de ma part...
    Pour ce qui est de la suppression, je voulais que ça supprime le modèle choisi (je viens de voir que mon code est a modifer car il est lié à l'id_variant et non au name_variant).

Discussions similaires

  1. Requéte MySQL et doublons
    Par piratack007 dans le forum Requêtes
    Réponses: 5
    Dernier message: 21/01/2013, 18h09
  2. Réponses: 1
    Dernier message: 02/01/2008, 13h28
  3. Requête ajout sans doublons
    Par oceanediana dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/08/2006, 11h20
  4. Requête de soustraction sans doublons
    Par waloon dans le forum Requêtes
    Réponses: 3
    Dernier message: 24/01/2006, 23h22
  5. Requête MySQL sans résultat...
    Par x86-master dans le forum Installation
    Réponses: 13
    Dernier message: 10/12/2005, 14h19

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