Mysql
 sql >> Base de données >  >> RDS >> Mysql

Masquer les résultats en double dans la requête MySQL

Il y a toujours un moyen. La question est "devrions-nous faire cela". Notez qu'en faisant cela, vous masquez les données de la marque. Si les données sont réorganisées, triées, le trieur perd la capacité de savoir quelle marque correspond à quelle ligne. S'il ne s'agit que d'un rapport imprimé qui ne doit pas être recouru ou attendu à un PDF où un utilisateur ne peut pas manipuler les données, alors ok. toutes les données.

Personnellement, je trouve cet affichage d'informations désagréable sur des données électroniques, mais acceptable sur des formulaires imprimés ou des rapports statiques. La raison :sur électronique je peux importer dans excel trier et jouer avec les données; mais si les colonnes "manquent" des données redondantes, la manipulation électronique devient problématique.

Travailler avec SQLfiddle

CREATE Table foo (
 brand varchar(20),
 description varchar(20),
 prodcode varchar(20));


Insert into foo values ('Brand1', 'Description1', 'Product1'),
('Brand1', 'Description2', 'Product2'),
('Brand1', 'Description3', 'Product4'),
('Brand2', 'Description3', 'Product4'),
('Brand2', 'Description3', 'Product4'),
('Brand1', 'Description3', 'Product3');

REQUÊTE :

SELECT case [email protected] <> f.brand then @Var :=brand end as Brand
     , f.description
     , f.prodcode
FROM (SELECT * FROM foo ORDER BY brand, description, prodcode) f
CROSS JOIN  (SELECT @var := '') b

RÉSULTATS :

Brand   description     prodcode
Brand1  Description1    Product1
(null)  Description2    Product2
(null)  Description3    Product3
(null)  Description3    Product4
Brand2  Description3    Product4
(null)  Description3    Product4

Pourquoi cela fonctionne :

La magie opère dans la jointure croisée et dans l'évaluation des cas.

Il y a 1 table. Nous trions les dossiers avant de rejoindre. Nous créons une variable utilisateur appelée @var et la définissons sur '' sur le premier enregistrement de la table foo. Ensuite, nous attribuons @var à la marque du premier disque. Lorsque la croix SQL rejoint le 2e fichier, @var est désormais la marque du premier enregistrement. Si les marques correspondent, aucun enregistrement n'est affiché, si les marques ne correspondent pas, nous changeons la valeur de @var et affichons la nouvelle valeur.

Risques :

  • si d'autres jointures de table se produisent, ou si l'ordre n'est pas celui souhaité dans la table, nous devons d'abord effectuer une sous-requête sur "foo" pour trier par marque
  • appliquer n'importe quel ordre par à ceci qui implique la marque1 est désormais sans valeur
  • Ce n'est pas aussi réutilisable. Un autre module qui souhaite exploiter les données (affichage) n'est plus en mesure de le faire car la marque a été masquée sur certains enregistrements.