MySQL SELECT DISTINCT mehrere Spalten


78

Angenommen, ich habe Spalten a, b c, din einer Tabelle in einer MySQL-Datenbank. Ich versuche, die unterschiedlichen Werte ALLER dieser 4 Spalten in meiner Tabelle auszuwählen (nur die unterschiedlichen Werte). Ich habe Sachen ausprobiert wie:

SELECT DISTINCT a,b,c,d FROM my_table;
SELECT DISTINCT a,b,c,d FROM my_table GROUP BY a,b,c,d;

Keiner von denen hat funktioniert. Kann hier jemand helfen?

Vielen Dank

HINWEIS Ich möchte die unterschiedlichen Werte der Spalten a, b, c dseparat. Nicht die eindeutige Kombination von Werten


Wenn es eine eindeutige Spalte hat, funktioniert dies nicht. different funktioniert nicht für eindeutige Spalten.
— Hammad Khan

Keine der Spalten ist eindeutig
— user765368

dann erhalten Sie das richtige Ergebnis, solange Sie nicht join verwenden
— Hammad Khan

2
Sie sollten erklären, was Sie unter "unterschiedlichen Werten ALLER dieser 4 Spalten" verstehen, da dies für Sie etwas anderes bedeuten muss, als es normalerweise bedeutet, dass diese Abfragen nicht das zurückgeben, was Sie möchten. Probendaten und Probenausgabe wären eine präzise Möglichkeit, dies zu vermitteln.
— Dan Grossman

2
Ich möchte unterschiedliche Werte von a, b, c und d, keine Kombination von Werten
— user765368

Antworten:


51

kann das helfen?

select 
(SELECT group_concat(DISTINCT a) FROM my_table) as a,
(SELECT group_concat(DISTINCT b) FROM my_table) as b,
(SELECT group_concat(DISTINCT c) FROM my_table) as c,
(SELECT group_concat(DISTINCT d) FROM my_table) as d

8
Was ist, wenn ich nur unterschiedliche Ergebnisse aus den ersten beiden Spalten benötige, aber alle Spalten
— anzeigen muss

1
ncastro's ist besser. Kühler, jedenfalls einfacher.
— Buffalo

Hey Nesim, danke! Übrigens, wenn "my_table" eine ganze Abfrage ist, wie kann ich sie beim Namen nennen und immer wieder abrufen
— Tomer

Dieses Ergebnis ergibt jedoch einen durch Kommas getrennten Wert. Wie kann ich diese Probleme loswerden?
— Chayan Biswas

Chayan, das ist ein anderes Thema, aber es istREPLACE(group_concat(DISTINCT d),',',' ')
— Slam

77

Ich weiß, dass die Frage sowieso zu alt ist:

select a, b from mytable group by a, b

wird Ihnen alle Kombinationen geben.


2
Irgendwie cool. Die 'Gruppe von' erzwingt die Unterscheidbarkeit. Passiert das?
— Jibran

Könnten Sie bitte die Frage etwas näher erläutern?
— Jorge Lavín

9
@ncastro Entschuldigung, aber diese Antwort erfüllt die Frage nicht.
— Wissensverlangen

Dieser ist langsam für große Tische.
— John T

20

Wenn Sie die gewünschten Ergebnisse erraten, ist dies möglicherweise die gewünschte Abfrage

SELECT DISTINCT a FROM my_table
UNION 
SELECT DISTINCT b FROM my_table
UNION
SELECT DISTINCT c FROM my_table
UNION
SELECT DISTINCT d FROM my_table

1
Das funktioniert auch, aber ich mag die Trennung zwischen den Ergebnissen in Nesim Razons Antwort besser. Vielen Dank
— user765368

Cool - ich wollte sie kombinieren
— Adrian Cornish

4
Wenn Sie DISTINCT-Werte in allen Spalten wünschen, müssen Sie diese Abfrage in eine andere SELECT-Anweisung wie diese einschließen:SELECT DISTINCT value FROM ( SELECT DISTINCT a AS value FROM my_table UNION SELECT DISTINCT b AS value FROM my_table UNION SELECT DISTINCT c AS value FROM my_table ) AS derived
— T. Brian Jones

SELECT e,f FROM ( SELECT DISTINCT zdjh AS e FROM tj_xhqd` UNION SELECT DISTINCT sjsj AS f VON tj_xhqdUNION SELECT DISTINCT xhqd AS g FROM tj_xhqd) a` gibt mirError Code: 1054 Unknown column 'f' in 'field list'
— Moeez

18

Ein anderer einfacher Weg, dies zu tun, ist mit concat()

SELECT DISTINCT(CONCAT(a,b)) AS cc FROM my_table GROUP BY (cc);

Entschuldigung, aber ich kann kein Äquivalent in der Derby-Datenbank finden.
— Pranjal Choladhara

Das ist klug und genau das, was ich brauchte
— xtian

Das hat bei mir funktioniert. Ich wusste nicht, wie ich die anderen Antworten mit den mehreren
— Verknüpfungen

Ungültiger Spaltenname 'cc'.
— Paddymac

Sehr langsam für große Tische.
— John T

9

Beide Ihre Fragen sind korrekt und sollten Ihnen die richtige Antwort geben.

Ich würde die folgende Abfrage vorschlagen, um Ihr Problem zu beheben.

SELECT DISTINCT a,b,c,d,count(*) Count FROM my_table GROUP BY a,b,c,d
order by count(*) desc

Das ist das Feld count (*) hinzufügen. Auf diese Weise erhalten Sie eine Vorstellung davon, wie viele Zeilen mit dem Befehl group entfernt wurden.


Ich möchte unterschiedliche Werte von a, b, c und d, keine eindeutige Kombination von Werten
— user765368

@hmd: Danke für diese Lösung. Genau das, was ich brauchte. Gibt es eine Möglichkeit, eine whereBedingung aufzunehmen? Ich wollte nur Zeilen, in denen die Anzahl größer als 1 war. Versucht, select distinct a,b,c,count(*) from MyTempTable group by a,b,c order by count(*) desc where count(*)>1;aber es hat nicht funktioniert.
— Nav

@ Nav42 müssen Sie having count(*) > 1nicht verwenden, whereda dies eine aggregierte Abfrage ist. Übrigens geht meine Antwort nicht genau auf die OP-Frage ein, wie er oben beschrieben wurde. Sowieso gerne helfen.
— Hammad Khan

Funktioniert. Vielen Dank. Wählen Siedistinct a,b,c,count(*) from MyTable group by a,b,c having count(*) > 1 order by count(*) desc
— Nav

9

Dies gibt DISTINCT-Werte in allen Spalten an:

SELECT DISTINCT value
FROM (
    SELECT DISTINCT a AS value FROM my_table
    UNION SELECT DISTINCT b AS value FROM my_table
    UNION SELECT DISTINCT c AS value FROM my_table
) AS derived

Schönes Beispiel, das mein Problem leicht gelöst hat. Vielen Dank.
— delliottg

Es gibt mir die Werte in der einzelnen Spalte. Was ist, wenn ich sie separat anzeigen möchte?
— Moeez
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.