Nicole: MYSQL-JOIN kombi mit DISTINCT

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

  1. 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

  2. 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

    1. 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).

      1. 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

        --
        Nein, wir frieren unsere Hühner nicht auf Gletschern fest.
        Selfcode: sh:) fo:) ch:) rl:) br:> n4:| ie:{ mo:) va:) de:] zu:} fl:( ss:) ls:&
        1. 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

          1. 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

            1. 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_.

              1. 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