Comment trier les lignes en double dans une table de paires clé-valeur sur plusieurs colonnes dans MySQL ?
P粉115840076
P粉115840076 2023-09-05 18:21:40
0
1
480
<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粉115840076
P粉115840076

répondre à tous(1)
P粉659518294

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.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal