Mysql
 sql >> база данни >  >> RDS >> Mysql

Скриване на дублиращи се резултати в MySQL заявка

Винаги има начин. Въпросът е "Трябва ли да направим това". Имайте предвид, че по този начин скривате данните за марката. Ако данните бъдат пренаредени, сортирани, сортировачът губи способността да знае коя марка е за какъв ред. Ако това е просто отпечатан отчет, който не трябва да се прибягва или да се очаква до PDF, където потребителят не може да манипулира данните, тогава добре.. Но ако това е така, потребителят може да изхвърли, за да excel и да манипулира по-късно... по-добре да имате всички данни.

Аз лично намирам това показване на информация за отвратително за електронни данни, но добре за печатни формуляри или статични отчети. Причината:на електронно мога да импортирам в excel сортиране и да играя с данните; но ако колоните "липсват" излишни данни, електронната манипулация става проблематична.

Работен 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');

ЗАПИТВАНЕ:

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

РЕЗУЛТАТИ:

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

Защо това работи:

Магията се случва в кръстосаното съединение и при оценката на случая.

Има 1 маса. Подреждаме записите, преди да се присъединим. Създаваме потребителска променлива, наречена @var и я задаваме на '' на първия запис в таблица foo. След това присвояваме @var на марката на първия запис. Когато SQL кръстът се присъедини към 2-ри попълнен, @var вече е марката на първия запис. Ако марките съвпадат, не се показва запис, ако марките не съвпадат, променяме стойността на @var и показваме новата стойност.

Рискове:

  • ние ако се свържат други таблици или редът не е според желанията в таблицата, ще трябва първо да направим подзаявка на „foo“, за да подредим по марка
  • прилагането на каквато и да е поръчка от към това, която включва марка1, вече е безполезно
  • Не е за многократна употреба. Друг модул, който може да иска да използва данните (изглед), вече не може да го направи, тъй като марката е била скрита в някои от записите.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Въведение в SQL индексите

  2. Как да изберете най-новия набор от датирани записи от таблица на mysql

  3. Възможно ли е да се използва SQL за сортиране по дата, но да се поставят нулеви дати в задната част на набора от резултати?

  4. Система за уведомяване, използваща php и mysql

  5. Каква е разликата между ifnull и coalesce в mysql?