sql >> Databáze >  >> RDS >> Mysql

Skrýt duplicitní výsledky v dotazu MySQL

Vždy existuje cesta. Otázka zní:„Máme to udělat“. Všimněte si, že tím skryjete údaje o značce. Pokud se data přeuspořádají, seřadí, třídič ztratí schopnost vědět, která značka je pro který řádek. Pokud se jedná pouze o tištěnou zprávu, kterou nelze uchýlit nebo očekávat do PDF, kde uživatel nemůže manipulovat s daty, pak je to v pořádku. Ale pokud je to tak, může uživatel uložit do excelu a manipulovat s ním později... všechna data.

Osobně považuji toto zobrazování informací za nechutné na elektronických datech, ale v pořádku na tištěných formulářích nebo statických sestavách. Důvod:na elektronické jsem schopen importovat do excelu třídit a hrát si s daty; ale pokud ve sloupcích „chybějí“ nadbytečná data, pak se elektronická manipulace stává problematickou.

Fungující 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');

DOTAZ:

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

VÝSLEDKY:

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

Proč to funguje:

Kouzlo se odehrává v křížovém spojení a při vyhodnocování případu.

Je tam 1 stůl. Než se připojíme, třídíme záznamy. Vytváříme uživatelskou proměnnou s názvem @var a nastavujeme ji na '' v prvním záznamu v tabulce foo. Poté přiřadíme @var ke značce první desky. Když se křížek SQL připojí k 2. poli, @var je nyní značkou prvního záznamu. Pokud se značky shodují, nezobrazí se žádný záznam, pokud se značky neshodují, změníme hodnotu @var a zobrazíme novou hodnotu.

Rizika:

  • pokud dojde k dalším spojením tabulek nebo pořadí není v tabulce požadované, museli bychom nejprve provést dílčí dotaz na „foo“, abychom mohli seřadit podle značky
  • použít na to jakoukoli objednávku, která zahrnuje značku1, je nyní bezcenné
  • Není tak znovu použitelný. Jiný modul, který může chtít využít data (zobrazení), to již nedokáže, protože značka byla na některých záznamech skryta.


  1. Rozdělte záznam vrácený funkcí do více sloupců

  2. Jak vyléčím příčinu výjimky Hibernate Při volání setter došlo k výjimce IllegalArgumentException?

  3. PHP - Zaškrtávací políčko Vytvořit pomocí záznamů z databáze MySQL jako hodnot

  4. Jak VYBRAT náhodné řádky z tabulky s přesným počtem řádků?