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

Skjul duplikerede resultater i MySQL-forespørgsel

Der er altid en vej. Spørgsmålet er "Skal vi gøre det her". Bemærk ved at gøre dette skjuler du branddataene. Hvis dataene omarrangeres, sorteres, mister sortereren muligheden for at vide, hvilket mærke der er for hvilken række. Hvis dette kun er en udskrevet rapport, der ikke skal ty eller forventes til en PDF, hvor en bruger ikke kan manipulere dataene, så ok.. Men hvis det er sådan, kan en bruger dumpe for at excel og manipulere senere... bedre at have alle data.

Jeg synes personligt, at denne visning af information er usmagelig på elektroniske data, men ok på trykte formularer eller statiske rapporter. Årsagen:på elektronisk er jeg i stand til at importere til excel sortere og lege med dataene; men hvis kolonner "mangler" redundante data, så bliver elektronisk manipulation problematisk.

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

FORESPØRGSEL:

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

RESULTATER:

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

Hvorfor dette virker:

Magien sker i krydssammenføjningen og på case-evalueringen.

Der er 1 bord. Vi sorterer posterne, før vi tiltræder. Vi opretter en brugervariabel kaldet @var og sætter den til '' på den første post i tabel foo. Så tildeler vi @var mærket på den første plade. Når SQL-krydset slutter sig til den 2. fil, er @var nu mærket for den første post. Hvis mærkerne matcher, vises ingen registrering, hvis mærkerne ikke matcher, ændrer vi værdien af ​​@var og viser den nye værdi.

Risici:

  • hvis andre tabeller tilslutter sig, eller rækkefølgen ikke er som ønsket i tabellen, skal vi først lave en underforespørgsel på "foo" for at bestille efter mærke
  • at påføre en ordre ved dette, som involverer brand1, er nu værdiløst
  • Den er ikke så genbrugelig. Et andet modul, som måske ønsker at udnytte dataene (visningen), er ikke længere i stand til at gøre det, fordi mærket er blevet skjult på nogle af registreringerne.


  1. SQL begrænser SELECT men ikke JOIN

  2. PayPal ODBC-driver

  3. Laravel-tilladelse nægtet på ekstern Mysql-server (AWS aurora)

  4. Mød Michal Bar og mig hos Microsoft Ignite!