sql >> Databasteknik >  >> RDS >> Mysql

Dölj dubbletter av resultat i MySQL-fråga

Det finns alltid ett sätt. Frågan är "Ska vi göra det här". Observera att genom att göra detta döljer du varumärkesdata. Om data ordnas om, sorteras, förlorar sorteraren förmågan att veta vilket märke som är för vilken rad. Om detta bara är en utskriven rapport som inte ska tillgripas eller förväntas till en PDF där en användare inte kan manipulera data så ok.. Men om det är så kan en användare dumpa för att excel och manipulera senare... bättre att ha all data.

Jag tycker personligen att denna visning av information är osmaklig på elektronisk data, men ok på tryckta formulär eller statiska rapporter. Anledningen:på elektronisk kan jag importera till excel sortera och leka med data; men om kolumner "saknar" redundant data så blir elektronisk manipulation problematisk.

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

FRÅGA:

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

RESULTAT:

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

Varför detta fungerar:

Magin händer i korskopplingen och i utvärderingen av ärendet.

Det finns 1 bord. Vi sorterar skivorna innan vi går med. Vi skapar en användarvariabel som heter @var och ställer in den på '' på den första posten i tabellen foo. Sedan tilldelar vi @var märket för den första skivan. När SQL-korset ansluter till den 2:a inlämnade är @var nu varumärket för den första posten. Om varumärkena matchar visas ingen post, om varumärkena inte matchar ändrar vi värdet på @var och visar det nya värdet.

Risker:

  • vi om andra tabeller går med, eller ordningen inte är som önskad i tabellen, skulle vi behöva göra en underfråga först på "foo" för att beställa efter varumärke
  • att tillämpa en beställning genom detta som involverar varumärke1 är nu värdelöst
  • Den är inte lika återanvändbar. En annan modul som kanske vill utnyttja data (vy) kan inte längre göra det eftersom varumärket har dolts i några av posterna.


  1. Accentokänslig sökfråga i MySQL

  2. Okänd MySQL-servervärd

  3. mysqli infoga - men bara om det inte är en dubblett

  4. Nya AMD-processorfamiljer kan jämföras bra med nya Intel-processorer