Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Doppelte Ergebnisse in MySQL-Abfrage ausblenden

Es gibt immer einen Weg. Die Frage ist "Sollen wir das tun". Beachten Sie, dass Sie dadurch die Markendaten ausblenden. Wenn die Daten neu geordnet, sortiert werden, verliert der Sortierer die Fähigkeit zu wissen, welche Marke für welche Reihe ist. Wenn dies nur ein gedruckter Bericht ist, der nicht auf ein PDF zurückgegriffen werden soll oder erwartet werden soll, wo ein Benutzer die Daten nicht manipulieren kann, dann ok alle Daten.

Ich persönlich finde diese Anzeige von Informationen auf elektronischen Daten unangenehm, aber auf gedruckten Formularen oder statischen Berichten in Ordnung. Der Grund:Auf elektronischem Wege kann ich in Excel sortieren und mit den Daten spielen; aber wenn in Spalten redundante Daten "fehlen", wird die elektronische Manipulation problematisch.

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

FRAGE:

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

ERGEBNISSE:

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

Warum das funktioniert:

Die Magie passiert im Cross Join und bei der Fallbewertung.

Es gibt 1 Tisch. Wir sortieren die Aufzeichnungen, bevor wir beitreten. Wir erstellen eine Benutzervariable namens @var und setzen sie auf '' im ersten Datensatz in der Tabelle foo. Dann weisen wir @var der Marke des ersten Datensatzes zu. Wenn der SQL-Cross-Join mit dem zweiten Feld verknüpft wird, ist @var jetzt die Marke des ersten Datensatzes. Wenn die Marken übereinstimmen, wird kein Datensatz angezeigt, wenn die Marken nicht übereinstimmen, ändern wir den Wert von @var und zeigen den neuen Wert an.

Risiken:

  • Wenn andere Tabellenverknüpfungen auftreten oder die Reihenfolge in der Tabelle nicht wie gewünscht ist, müssen wir zuerst eine Unterabfrage für "foo" durchführen, um nach Marke zu sortieren
  • Jede Bestellung von darauf anzuwenden, die Marke1 betrifft, ist jetzt wertlos
  • Es ist nicht so wiederverwendbar. Ein anderes Modul, das möglicherweise die Daten nutzen möchte (Ansicht), kann dies nicht mehr, da die Marke auf einigen der Datensätze ausgeblendet wurde.