Maison  >  Questions et réponses  >  le corps du texte

Comment trier les lignes en double dans une table de paires clé-valeur sur plusieurs colonnes dans MySQL ?

<p>J'ai donc le tableau suivant de paires clé/valeur, l'utilisateur soumet des données via le formulaire et chaque question du formulaire est ajoutée au tableau ici sous la forme d'une ligne distincte. <code>Submission_id</code> identifie chaque soumission de formulaire. </p> <pre class="brush:php;toolbar:false;">+----+---------------+---------------- ---+--------+ | identifiant | clé_id de soumission | +----+---------------+--------------+--------+ | 1 | 10 | fabricant | | 2 | 10 | modèle 5s | | 3 | 10 | prénom | | 4 | 15 | fabricant | | 5 | 15 | modèle 5s | | 6 | 15 | prénom | | 7 | 20 | fabricant | | 8 | 20 | modèle 5s | | 9 | 20 | prénom | +----+---------------+--------------+--------+≪/pré> ; <p>Comme le montrent les données ci-dessus, les commits avec les identifiants 10 et 15 ont la même valeur (seuls les identifiants de commit sont différents). Cela est essentiellement dû au fait que l'utilisateur a soumis le même formulaire deux fois, il s'agit donc d'un doublon. </p> <p>J'essaie de trouver un moyen de trier ces tableaux afin que toutes les soumissions en double apparaissent ensemble dans l'ordre. Compte tenu du tableau ci-dessus, j'essaie de construire une requête qui me donne les résultats suivants : </p> <pre class="brush:php;toolbar:false;">+---------------+ | soumission_id | +-------------+ 10 | 15 | 20 | +-------------------+</pré> <p>Je veux donc vérifier si un commit a la même valeur pour les touches <code>fabricant</code>, <code>model</code> Si tel est le cas, ils obtiennent l'identifiant de validation et sont placés les uns à côté des autres dans les résultats. Il y a d'autres clés dans le tableau actuel, mais je souhaite uniquement faire correspondre les doublons en fonction de ces 3 clés (fabricant, modèle, prénom). </p> <p>J'y réfléchis depuis longtemps et j'essaie de trouver des solutions possibles, mais je n'ai rien trouvé de fiable. </p>
P粉115840076P粉115840076388 Il y a quelques jours447

répondre à tous(1)je répondrai

  • P粉659518294

    P粉6595182942023-09-06 00:57:21

    Ceci n'est pas un tableau clé-valeur. Souvent appelé table/relation/schéma entité-attribut-valeur.

    Regardez la question, si les tableaux étaient disposés sous la première et la deuxième forme normale, cela serait trivial - il suffit de concaténer les valeurs, de regrouper par ces valeurs et de compter....

    SELECT manufacturer, model, firstname, COUNT(DISTINCT submission_id)
    FROM atable
    GROUP BY  manufacturer, model, firstname
    HAVING COUNT(DISTINCT submission_id)>1;

    ou utilisez Connect....

    SELECT a.manufacturer, a.model, a.firstname
    , a.submission_id, b.submission_id
    FROM atable a
    JOIN atable b
    ON a.manufacturer=b.manufacturer
    AND a.model=b.model
    AND a.firstname=b.firstname
    WHERE a.submission_id<b.submission_id
    ;

    Ou utilisez le tri et comparez les lignes adjacentes....

    SELECT *
    FROM
    (
    SELECT @prev.submission_id AS prev_submission_id
    , @prev.manufacturer AS prev_manufacturer
    , @prev.model AS prev_model
    , @prev.firstname AS pref_firstname
    , a.submission_id
    , a.manufacturer
    , a.model
    , set @prev.submission_id:=a.submission_id as currsid
    , set @prev.manufacturer:=a.manufacturer as currman
    , set @prev.model:=a.model as currmodel
    , set @prev.firstname=a.forstname as currname
    FROM atable
    ORDER BY manufacturer, model, firstname, submission_id
    )
    WHERE prev_manufacturer=manufacturer
    AND prev_model=model
    AND prev_firstname=firstname
    AND prev_submission_id<>submission_id;

    La solution est donc simplement de faire en sorte que vos données ressemblent à une relation normale....

    SELECT ilv.values
    , COUNT(ilv.submission_id)
    , GROUP_CONCAT(ilv.submission_id)
    FROM 
     (SELECT a.submission_id
      , GROUP_CONCAT(CONCAT(a.key, '=',a.value)) AS values
      FROM atable a
      GROUP BY a.submission_id
     ) ilv
    GROUP BY ilv.values
    HAVING COUNT(ilv.submission_id)>1;

    J'espère que les solutions basées sur la concaténation et la séquence devraient être évidentes maintenant.

    répondre
    0
  • Annulerrépondre