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

user765368
quelle
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
Nesim Razon
quelle
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.

Nicolas Castro
quelle
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
Adrian Cornish
quelle
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);
Kelhen
quelle
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.

Hammad Khan
quelle
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
T. Brian Jones
quelle
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