MYSQL-JOIN kombi mit DISTINCT
Nicole
- datenbank
Hallo erst mal ;-)
Folgendes Problem:
Ich möchte mehrere Tabellen abfragen mit Join.
Das klappt ;-)
------
Dann möchte ich gleichzeitig doppelte ausfiltern mit distinct.
Das klappt teilweise ;-(
------
SELECT distinct
a.nummer,a.nummer1,a.name,a.nummer2,
b.nummer
from x\_1
as a
INNER JOIN 'x_2'as b
on a.nummer=b.nummer
DAS PROBLEM:
Sobald ich den namen anzeigen lasse(a.name)
werden nur doppelte namen rausgefiltert,
nummern kommen allerdings doppelt vor.
Lass ich aber das Feld name aus:
------
SELECT distinct
a.nummer,a.nummer1,a.nummer2,
b.nummer
from x\_1
as a
INNER JOIN 'x_2'as b
on a.nummer=b.nummer
------
Dann sind keine doppelten nummern vorhanden,
nur fehlt mir dann natürlich der name zur Nummer.
FRAGE:
Wie kann ich mit distinct sowohl doppelte nummern und doppelte namen
aussortieren, und warum tritt dieses Problem überhaupt auf ?
Gruss Nikki
Halihallo Nicole
FRAGE:
Wie kann ich mit distinct sowohl doppelte nummern und doppelte namen
aussortieren, und warum tritt dieses Problem überhaupt auf ?
SELECT DISTINCT liefert dir unterschiedliche "Zeilen", ein DISTINCT für einzelne
Spalten gibt es nur, wenn das SELECT-Statement nur eine Spalte projeziert, oder
in Aggregatsfunktionen.
Wenn du sicherstellen willst, dass du nur unterschiedliche Nummern und unterschiedliche
Namen bekommst, musst du über zwei SQL-Queries gehen.
Viele Grüsse
Philipp
Halihallo Nicole, zweiter Versuch ;)
FRAGE:
Wie kann ich mit distinct sowohl doppelte nummern und doppelte namen
aussortieren, und warum tritt dieses Problem überhaupt auf ?
SELECT a.name, max(a.nummer1) AS 'nummer2', max(a.nummer2) AS 'nummer2' FROM ...
aber eben: max... Du musst es über Agregatsfunktionen machen, denn die Ergebnismenge
wird immer eine Multimenge bleiben. Das was du suchen würdest, wäre eine NF2-Tabelle
(NonFirst NormalForm => wiederspricht der 1. Normalform).
Viele Grüsse
Philipp
Hallo Philipp,
oweia jetzt wirds theoretisch.
Ich bein leider noch kein Mysql Profi,
muss mir alles mühsam allleine beibringen( schluchzzz;-).
Na ja für mich wars dann schonein Erfolgserlebniss
die Abfragemöglichkeiten mit Mysql besser kennen zu lernen.
Aber jetzt bin ich gierig und will mehr...
Was ich damit sagen will ist:
Leider kein Material gefunden, mit dem einem
Laien ( mir ;-) deine beschriebenen aggregatfunktionen
näher erkärt werden. Ich verstehe es einfach nicht.
was soll max denn machen damit
distinct in dem Feld wirkt wo ich möchte ?
Gruss Nikki und danke für die Hilfe
SELECT a.name, max(a.nummer1) AS 'nummer2', max(a.nummer2) AS 'nummer2' FROM ...
aber eben: max... Du musst es über Agregatsfunktionen machen, denn die Ergebnismenge
wird immer eine Multimenge bleiben. Das was du suchen würdest, wäre eine NF2-Tabelle
(NonFirst NormalForm => wiederspricht der 1. Normalform).
Hi Nicole
Ich bein leider noch kein Mysql Profi,
muss mir alles mühsam allleine beibringen( schluchzzz;-).
Genauso wie viele hier, Tränendrüse hilft dir nicht.
Was ich damit sagen will ist:
Leider kein Material gefunden, mit dem einem
Laien ( mir ;-) deine beschriebenen aggregatfunktionen
näher erkärt werden. Ich verstehe es einfach nicht.
Das auf diesem Server hast du gefunden?
http://aktuell.de.selfhtml.org/tippstricks/datenbanken/having/index.htm
Gruss Daniela
Hi Daniela,
Genauso wie viele hier, Tränendrüse hilft dir nicht.
...aber löst den Frust ;-)
Das auf diesem Server hast du gefunden?
http://aktuell.de.selfhtml.org/tippstricks/datenbanken/having/index.htm
Ja habe ich, nur leider seh ich keinen Zusammenhang
mit meiner Frage. Inwieweit diese Funktionen eine Lösung
für mein Problem sein können.
Natürlich weiss ich was max, having etc. im einzelnen
macht, nicht aber wie in Kombi mit join und distinct
eine Lösung für mein Problem ergeben soll.
Das ist es, was ich nicht verstehe,
damit ich Philipps Lösung umsetzen kann.
Danke
Nikki
Halihallo Nicole
Natürlich weiss ich was max, having etc. im einzelnen
macht, nicht aber wie in Kombi mit join und distinct
eine Lösung für mein Problem ergeben soll.
Ich glaube eben, dass es keine gibt. Weil es eben keine NF2 Ergebnismengen gibt (das ist
zwar keine Argumentation, wohl aber die Ursache).
Das ist es, was ich nicht verstehe,
damit ich Philipps Lösung umsetzen kann.
... bei der noch ein GROUP BY a.name fehlte...
---
Ich weiss noch immer nicht wirklich, was du _genau_ machen willst. Du möchtest irgendwie
Name und die Telefonnummer(n) dieser Person ausgeben, dabei sollen Name und Telefonnummer
nur jeweils einmal vorkommen. Nun gut, aber einige Personen haben mehrere Telefonnummern
und somit (eben unter der Voraussetzung, dass es keine NF2-Tabellen gibt) wirst du
auch mehrere gleiche "Namen"-Felder haben. In SQL kannst du nur z. B. nach Name
Gruppieren und dann eine (eben min/max) Telefonnummer aussuchen, sobald du zwei
Nummern/Name ausgeben möchtest, wirst du auch zweimal den selben Namen erhalten, anders
_geht es nicht_.
Viele Grüsse
Philipp
Hallo Phillip,
danke für deine Mühe, aber ehrlich gesagt
ich verstehs immer noch nicht ganz.
Ist zwar kein Tel/namen verzeichniss aber der Vergleich passt,
alles was sch will ist eben aus diesen 2 Tabellen nummern erhalten die nicht doppelt sind, und die Abfrage macht das auch wunderschön.
Nur leider nicht wenn auch der Name ausgegeben werden soll,
dann stellt sich Mysql stur und filtert nur die doppelten Namen raus,
nicht aber die Nummern.
Na ja werds halt mit einer Schleife in PHP lösen müssen.
Nimmst Du eigentlich Programmieraufträge an ?
Falls JA, schreib mir doch mal an meine Email.
Danke Nikki
Gruppieren und dann eine (eben min/max) Telefonnummer aussuchen, sobald du zwei
Nummern/Name ausgeben möchtest, wirst du auch zweimal den selben Namen erhalten, anders
_geht es nicht_.
Halihallo Nicole
Nur leider nicht wenn auch der Name ausgegeben werden soll,
dann stellt sich Mysql stur und filtert nur die doppelten Namen raus,
nicht aber die Nummern.
Das kann ich mir nicht vorstellen (zumindest nach meinem Bild deiner Tabellenlayout und
dem Query). Ein DISTINCT(ROW) passt die Ergebnismenge so an, dass jede Zeile als Einheit
eindeutig ist, folglich nur einmal vorkommt. Etwas wie:
+--------+------+------+
|name | tel1 | tel2 |
+--------+------+------+
|frazy | 01 | 02 |
|noldi | 03 | 01 |
|frazy | 01 | 02 |
+--------+------+------+
kann nicht vorkommen, da frazy|01|02 zweimal vorkommt. Alle gleichen Zeilen werden
gestrichen.
---
Was bringt dir ein
SELECT a.name, a.nummer, a.nummer1, a.nummer2
FROM x_1 AS a,
x_2 AS b
WHERE a.nummer=b.nummer
GROUP BY a.name, a.nummer, a.nummer1, a.nummer2
Das entspricht in etwa dem, was DISTINCT(ROW) macht. Vielleicht hilft dir diese
Überlegung beim Verständnis (oder löst das Problem gar). Ich habe gelesen, dass
DISTINCT in MySQL der 3.xx Versionen Probleme machen kann (OK, wenn GROUP BY im Spiel
ist, was bei dir IMHO nicht der Fall war).
Viele Grüsse
Philipp