2 Stimmen

Mehrere Spalten unterscheiden sich in mysql

| one | two |
-------------
| A   | 1   |
| A   | 2   |
| B   | 1   |
| B   | 3   |
| C   | 1   |
| C   | 4   |

Ich möchte keine Wiederholungen in einer Spalte in einer Abfrage erhalten, so dass die Standard SELECT DISTINCT one,two FROM table; oder SELECT * FROM table GROUP BY one,two; funktioniert nicht ganz, weil es nach distinct in allen Zeilen sucht, was in diesem Fall alle 6 Zeilen ergeben würde.

Idealerweise suche ich nach:

| one | two |
-------------
| A   | 1   |
| B   | 3   |
| C   | 4   |

In PHP (etc.) würde ich dies einfach mit einem Array für jede Spalte tun, und wenn eine Spalte zuvor verwendet wurde, dann überspringen Sie die Zeile. Ich bin mir allerdings nicht sicher, wie man das in MySQL implementiert.

SELECT * FROM (SELECT * FROM table GROUP BY one) GROUP BY two - funktioniert fast. Aber da die äußere Abfrage nicht alle Alternativen sieht, werden gültige Optionen übersehen, d.h. die innere Abfrage wird auf A,B,C kollabieren, könnte aber auch auf todo 1s für Spalte zwei, was bedeuten würde, dass die zweite GROUP BY dann selbst auf eine Zeile zusammenfallen würde!

Ich weiß, dass die Reihenfolge der Duplizierung Überprüfung eine Auswirkung auf die genaue Zeilen zurückgegeben haben wird - nicht besorgt über das - ich will nur einen guten Querschnitt der Zeilen mit minimal ähnlichen Zeilen.

1voto

barryhunter Punkte 20669

Nun, wie sich herausstellt, habe ich eine Antwort gefunden ;)

CREATE TEMPORARY TABLE table2 ENGINE HEAP SELECT * FROM table;

ALTER IGNORE TABLE table2 ADD UNIQUE (one), ADD UNIQUE (two);

SELECT * FROM table2;

Das IGNORE in der alter-Tabelle ist wichtig, da es einfach alle doppelten Zeilen basierend auf dem eindeutigen Index verwirft s .

(Ich bin mir nicht sicher, warum ich nicht schon früher daran gedacht habe - denn ich habe es mit gutem Erfolg bei der Lösung von Abfragen im Stil von "order before group by" verwendet).

0voto

In SQL ist dies nicht möglich: Sie können sechs Zeilen (jedes eindeutige Tupel), fünf Zeilen (jede erste Verwendung jedes Spaltenwerts) oder eine Zeile (jede erste Verwendung jedes Werts in jeder Spalte, der in beiden Spalten erscheint) haben.

Der Grund, warum es Ihnen so schwer fällt zu erklären, was Sie wollen, ist, dass es auf einer menschlichen Entscheidung beruht. Sie werden nicht in der Lage sein, dies in SQL zu tun, bis Sie in der Lage sind, es qualitativ in Englisch zu beschreiben, und was Sie wollen, ist nicht qualitativ, sondern prozedural.

Es gibt eine Reihe von Möglichkeiten, sich dem anzunähern, z. B. die Gruppierung nach der kleineren Spalte und dann die Sortierung nach der umgekehrten Anzahl der Übereinstimmungen, aber sie sind alle ausnutzbar.

Solange Sie kein eindeutiges, logisch begründetes Auswahlkriterium angeben können, wird dies nicht gelingen. Zu sagen "minimal" zählt nicht, solange Sie nicht definieren, was minimal ist, und das Minimum, das Sie anscheinend wollen, erfordert ein prozedurales Aggregatverhalten, das Sie in MySQL nicht bekommen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X