Mysql
 sql >> Database >  >> RDS >> Mysql

Nascondi i risultati duplicati nella query MySQL

C'è sempre un modo. La domanda è "Dovremmo farlo". Nota in questo modo nascondi i dati del marchio. Se i dati vengono riordinati, ordinati, il selezionatore perde la capacità di sapere quale marca è per quale riga. Se questo è solo un report stampato che non deve essere utilizzato o previsto in un PDF in cui un utente non può manipolare i dati, allora ok.. Ma se è così un utente può eseguire il dump per eccellere e manipolare in seguito... meglio avere tutti i dati.

Personalmente trovo questa visualizzazione di informazioni sgradevole sui dati elettronici, ma ok su moduli stampati o rapporti statici. Il motivo:sull'elettronica sono in grado di importare in excel, ordinare e giocare con i dati; ma se le colonne contengono dati ridondanti "mancanti", la manipolazione elettronica diventa problematica.

SQLfiddle funzionante

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');

DOMANDA:

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

RISULTATI:

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

Perché funziona:

La magia avviene nel cross join e nella valutazione del caso.

C'è 1 tavolo. Stiamo ordinando i record prima di unirci. Stiamo creando una variabile utente chiamata @var e impostandola su '' sul primo record nella tabella foo. Quindi assegniamo @var al marchio del primo record. Quando la croce SQL si unisce al 2° archivio, @var è ora il marchio del primo record. Se i marchi corrispondono, non viene visualizzato alcun record, se i marchi non corrispondono, cambiamo il valore di @var e visualizziamo il nuovo valore.

Rischi:

  • se si verificano altri join di tabelle o l'ordine non è quello desiderato nella tabella, dovremmo prima eseguire una sottoquery su "foo" per ordinare per marca
  • applicare qualsiasi ordine per questo che coinvolge brand1 ora è inutile
  • Non è così riutilizzabile. Un altro modulo che potrebbe voler sfruttare i dati (visualizza) non è più in grado di farlo perché il marchio è stato nascosto su alcuni record.