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.