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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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