Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Ukryj zduplikowane wyniki w zapytaniu MySQL

Zawsze jest sposób. Pytanie brzmi:„Czy powinniśmy to zrobić”. Zauważ, że robiąc to, ukrywasz dane marki. Jeśli dane są ponownie uporządkowane, posortowane, sortownik traci możliwość rozpoznania, która marka jest dla jakiego rzędu. Jeśli jest to tylko wydrukowany raport, którego nie można odwoływać się ani oczekiwać w pliku PDF, w którym użytkownik nie może manipulować danymi, to ok.. Ale jeśli tak jest, użytkownik może zrzucić, aby osiągnąć Excel i później manipulować ... lepiej mieć wszystkie dane.

Osobiście uważam, że takie wyświetlanie informacji jest niesmaczne na danych elektronicznych, ale w porządku na drukowanych formularzach lub statycznych raportach. Powód:w wersji elektronicznej jestem w stanie zaimportować do sortowania Excela i bawić się danymi; ale jeśli w kolumnach „brakuje” nadmiarowych danych, manipulacja elektroniczna staje się problematyczna.

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

ZAPYTANIE:

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

WYNIKI:

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

Dlaczego to działa:

Magia dzieje się w łączeniu krzyżowym i ocenie przypadku.

Jest 1 stół. Porządkujemy rekordy, zanim dołączymy. Tworzymy zmienną użytkownika o nazwie @var i ustawiamy ją na „” w pierwszym rekordzie w tabeli foo. Następnie przypisujemy @var do marki pierwszego rekordu. Kiedy krzyż SQL łączy się z drugim polem, @var jest teraz marką pierwszego rekordu. Jeśli marki się zgadzają, nie jest wyświetlany żaden rekord, jeśli marki nie pasują, zmieniamy wartość @var i wyświetlamy nową wartość.

Zagrożenia:

  • my, jeśli wystąpią inne połączenia tabel lub kolejność w tabeli nie jest taka, jaka jest pożądana, musielibyśmy najpierw wykonać podzapytanie na „foo”, aby zamówić według marki
  • zastosowanie dowolnego zamówienia do tego, które dotyczy marki1, jest teraz bezwartościowe
  • Nie jest tak wielokrotnego użytku. Inny moduł, który może chcieć wykorzystać dane (widok), nie jest już w stanie tego zrobić, ponieważ marka została ukryta w niektórych rekordach.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przewodnik po projektowaniu bazy danych dla biuletynu w MySQL

  2. Używanie JDeveloper z bazą danych MySQL i bazą danych Oracle na AWS RDS, część 2

  3. Struktura bazy danych obejmująca pola dynamiczne

  4. Alternatywa dla z wyjątkiem MySQL

  5. Wiele lewych połączeń MySQL