Select Distinct
Sohail
- datenbank
Hallo,
ich habe da eine Frage.
Ich habe zwei Felder. Das erste Feld soll als Distinct ausgegeben werden.
Select Distinct Feld1,Feld2 From Tabelle Where...
Das funktioniert aber nicht.
Ich habe such so versucht:
Select Feld1,Feld2 From Tabelle Where... Group by Feld1,Feld2
Das funktioniert auch nicht.
Hat jemand eine Idee.
Danke
Sohail
Hi Sohail
Welche der zu Feld1 passenden Feld2 willst du denn haben?
Das musst du schon spezifizieren und dann mit Group by auf
Feld1 arbeiten. (MySQL hauts dir nicht um die Ohren afaik
sondern gibt dir zufällig eins zurück). Verwende deswegen
Agregate-Funktionen
Select Feld1, agregatefunction(Feld2)
from tabelle2
where deine Bedingungen
group by Feld1
Gruss Daniela
Hallo Daniela,
Feld1 ist Name und Feld2 sind die DateiNamen. Die Namen kommen mehrmals vor mit verschiedenen DateiNamen.
Select Name,Datei From pnamen Where Familie Like 'A%' Group by
Familie
Kannst du bitte mir da ein Beispiel bringen?
Danke
Sohail
Halihallo Sohail
Feld1 ist Name und Feld2 sind die DateiNamen. Die Namen kommen mehrmals vor mit verschiedenen DateiNamen.
Select Name,Datei From pnamen Where Familie Like 'A%' Group by
Familie
Kannst du bitte mir da ein Beispiel bringen?
SELECT DISTINCT Name, Datei FROM pnamen WHERE Familie LIKE 'A%' GROUP BY Name, Datei;
Sucht alle Familien, deren Name mit 'A' anfangen und gibt die dazugehörigen Namen und Dateien aus; es ist zu beachten, dass Name und Datei als "Einheit" behandelt wird und nur unterschiedliche Records aus dieser "Einheit" ausgegeben werden.
Viele Grüsse
Philipp
Hallo philipp,
und was heisst das genau. Dass ich da keine Distinct bekommen kann?
Sohail
Halihallo
und was heisst das genau. Dass ich da keine Distinct bekommen kann?
Keine Distincts auf eine Spalte, ja, nur "globale distincts". Wenn du eineindeutige Spaltenwerte in einer Spalte haben willst, verwende einen GROUP BY.
Viele Grüsse
Philipp
Hi Sohail
Nein, du gehst nämlich genau wie beim letzten Mal meiner Frage aus dem
Weg, es ist übrigens auch genau das selbe Problem wie beim letzten Mal.
Falls du sowas haben willst:
Name1 Datei1
Datei2
Datei3
Name2 Datei4
Datei5
...
Gleich von Anfang weg, für die Ausgabeformatierung sind deine Scripte
zuständig, nicht die Datenbank (gewisse der mächtigeren Datenbanken
können das auch, ich nehme aber mal an, du benutzt MySQL oder sowas).
In dem Fall müsstest du die Datenbank sortieren lassen nach Name und
per Script dann immer wenn der Name identisch zu der vorherigen Zeile
ist den Namen ausblanken.
Wenn das nicht ist was du willst, gib bitte kleine Datenbestände an
und die erwartete Ausgabe, du kannst nicht sagen, gib mir einen Namen
nur einmal und dazu Datei wenn du nicht sagst welche der vielen
möglichen Dateien.
Gruss Daniela
Hallo Daniela,
ich gehe keinesfalls deiner Frage aus dem Weg. Ich weiss aber nicht ganz genau, was du da meinst.
Meine Tabelle sieht so aus:
Name | ID
----------------
Sohail | 1
Sohail | 2
Sohail | 3
Sohail | 4
Andere1| 5
Andere1| 6
Andere2| 7
Andere2| 8
Ich brauche an dieser Stelle beide Felder und einer Distincten Ausgabe.
Name | ID
----------------
Sohail | 1
Andere1| 5
Andere2| 7
Wie bekomme ich das raus?
Danke
Sohail
Halihallo
Ich brauche an dieser Stelle beide Felder und einer Distincten Ausgabe.
Name | ID
Sohail | 1
Andere1| 5
Andere2| 7
Wie bekomme ich das raus?
Das ist nicht Distinct, sondern GROUP BY Name. Wenn du auch alle IDs zu den Namen willst, einfach meine Variante für 100% Distincte Angaben, oder wenn das nicht so ne grosse Rolle spielt, bzw. implizit gegeben ist, ein einfacher SELECT Name, ID FROM ... ohne GROUP BY
Viele Grüsse
Philipp
Hi Sohail
Ich brauche an dieser Stelle beide Felder und einer Distincten Ausgabe.
Name | ID
Sohail | 1
Andere1| 5
Andere2| 7
Mir fällt auf, du benutzt immer die niedrigste ID pro Benutzer, wenn das
immer so sein soll, sag das der Datenbank einfach:
Select Name, min(id)
from tabelle
[ where ...]
group by Name
[ order by ...]
Where und order by und so ganz nach Geschmack wie immer anzuwenden, wichtig
ist die Reihenfolge, nach Group by kommt nur noch ein allfälliges Having
und/oder order by.
Mit Group By sagst du, ich will alle Records die in allen danach
angegebenen Feldern identisch sind, zusammengefasst haben.
Nur darfst du für weitere nach dem Select angegebenen Werte keine
unterschiedlichen Werte mehr kriegen sonst hauen dir das die meisten
Datenbankmanagementsysteme um die Ohren.
Da kommt jetzt min ins Spiel, das ist eine Agregationsfunktion und
selektiert aus allen Zeilen der Gruppe die Zeile raus, welche in dem
Fall die tiefste ID hat.
Diese Diskusion hatten wir aber schonmal:
http://forum.de.selfhtml.org/archiv/2002/7/17050/
Gruss Daniela
Hallo Daniela,
vielen Dank nochmals für die damalige und Heutige Hilfe.
Du weiss doch, wenn man mitten in Arbeit ist, vergisst man die einfachsten Sachen oder übersieht die einfach.
Jedenfalls, muss es einen einfachen Weg für eine Distinct-Anweisung geben, wenn man mehr als ein Feld ausgeben will.
Ich wünsche dir schönes Wochenende.
Sohail
Hi Sohail
Jedenfalls, muss es einen einfachen Weg für eine Distinct-Anweisung geben, wenn man mehr als ein Feld ausgeben will.
Nein, weil er keine Ratespielchen treibt welche Werte du gerne in den
anderen Spalten haben möchtest. Entweder du gruppierst und definierst die
zusätzlichen Spalten wie ich es dir gezeigt habe, oder du sagst,
unterdrücke mir alles, was in allen! Spalten unterschiedlich ist.
Oder du benützt MySQL wo du bei Gruppen mit Feldern im Select die nicht
zur Gruppe gehören einfach zufällige Werte aus den möglichen Feldern
kriegst (imho völlig falsche Lösung, MySQL sollte auch Fehler ausgeben,
eine Datenbank darf nicht raten).
Gruss Daniela