Nicole: MYSQL DISTINCT DOPPELTE EINTRAEGE

Hallo erst mal ;-)

Folgendes Problem:
Ich möchte aus einer Mysql mittels PHP eine
Liste erhalten, welche doppelte rauswirft.

z.B. mysql_query("select distinct email from table...");

Das geht zwar, aber ich benötige mehr als ein Feld danach:

z.B. mysql_query("select distinct email,vorname,nachname from table...");

Bedeutet ich möchte alle Werte haben, aber spalten mit doppelten
emailadressen ignorieren.

Frage : Geht das irgendwie mit einer direkten Query Abfrage
oder muss ich mit PHP arbeiten, z.B. array_unique o.ä. ?
Dann weiss ich natürlich wies geht, aber lieber wäre mir ein query.

Gruss Nikki

  1. Servus Nicke,

    Du kannst distinct auch ur auf eine Spalte Anwenden.
    Also srpich mehrere Ergebnisse erziehlen aus Deiner Abfrage aber mit distinct nur eine Spalte berücksichtigen.

    Ich glaube mal es müsste so heissen:

    Selsct distinct(email), splate2, spalte 3  etc.

    Bin mir jetzt nicht ganz sicher hab ausnahmsweise den istinct Satz nicht im Kopf und auch kein Buch zum nachlesen zur Hand.

    Gruss Matze

    PS. Kauf dir eine SQL Referenz ist nicht teuer und beantworten Dir solche Fragen.

    1. Hallo Matze,

      Du kannst distinct auch ur auf eine Spalte Anwenden.
      Also srpich mehrere Ergebnisse erziehlen aus Deiner Abfrage aber mit distinct nur eine Spalte berücksichtigen.

      Ja ich möchte auch nur eine Spalte berücksichtigen,
      aber dennoch die anderen Felder dann ausgeben.

      Selsct distinct(email), splate2, spalte 3  etc.

      Eben genau das geht leider nicht,
      dann werden auch doppelte angezeigt.

      PS. Kauf dir eine SQL Referenz ist nicht teuer und beantworten Dir solche Fragen.

      Bücher habe ich genug, leider keinen Hinweis darauf gefunden.

      Gruss Nikki

      1. Servus,

        also unter Oracle klappt es so....

        Select id, Spalte1, Spalte2, Spalte3 from tabelle where Spalte1 = bzw. like (Select distinct(Spalte1) from table........

        Ich hoffe Du kannst folgen.

        Ist zwar aus sicht der Performance nicht die beste Lösung sollte jedoch klappen.

        Gruss Matze

    2. Hi,
      auch ohne Geld für ein Buch auszugeben kann man natürlich die MySQL Online Dokumentation unter http://www.mysql.com/doc/en/index.html durchsehen.
      Bei MySQL gibt es leider (laut Doku) das Problem, das distinct und distinctrow dasselbe machen, nämlich immer alle Felder mit einbeziehen.

      Doku:

      DISTINCT and DISTINCTROW are synonyms and specify that
      duplicate rows in the result set should be removed.

      Nun kenne ich Deine Applikation nicht, vielleicht kannst Du ja Deine Datensätze mit "group by" zusammenfassen, oder es ist halt doch etwas Handarbeit angesagt.

      Stephan
      http://www.w3solutions.de

      1. Hallo Stephan,

        Doku:

        DISTINCT and DISTINCTROW are synonyms and specify that
        duplicate rows in the result set should be removed.

        Danke für deine Hilfe, aber das Problem ist:
        Sobald eine Spalte vorhanden ist, welche nicht doppelt sein kann,
        wird alles angezeigt.

        Will sagen: distinct prüft alle felder in der query abfrage
        und sobald ich den autoincrement wert ID drin haben will,
        spuckt er mir alle reihen aus.
        z.B.
        mysql_query("select distinct (nachname),vorname,id,email...");

        Gruss Nikki

        1. Wie gesagt, distinct funktioniert so wie ditinctrow in MySQL, d.h. es werden immer alle Felder berücksichtigt, das mit der Klammer kannst Du Dir sparen.
          Das ist leider eine Unschönheit in MySQL die Du in Perl oder PHP oder was auch immer ausbügeln musst.

          Stephan
          http://www.w3solutions.de

          1. Wie gesagt, distinct funktioniert so wie ditinctrow in MySQL, d.h. es werden immer alle Felder berücksichtigt..
            Das ist leider eine Unschönheit in MySQL die Du in Perl oder PHP oder was auch immer ausbügeln musst.

            Danke Stephan,
            schade hatte gehofft, es geht doch irgendwie.
            z.B. mit join die gleiche tabelle nochmal abfragen
            oder etwas in der Art.

            Aber wenns nicht geht... ;-(

            Gruss Nikki

            1. In der kommenden MySQL Version müßte soetwas über einen Subselect gehen, also in etwa wie folgt. Aber so weit ich weiss nicht mit der aktuellen Version.

              Stephan
              http://www.w3solutions.de

        2. Moin,

          Danke für deine Hilfe, aber das Problem ist:
          Sobald eine Spalte vorhanden ist, welche nicht doppelt sein kann,
          wird alles angezeigt.

          Deswegen sollst du in diesem Fall auch GROUP BY nehmen. Wie in der MySQL-Doku ersichtlich ist, ist SELECT DISTINCT a,b,c ... im Ergebnis (jetzt mal abgesehen von der Sortierung) identisch zu SELECT a,b,c ... GROUP BY a,b,c. Das heisst, SELECT a,b,c ... GROUP BY a macht genau was du willst. (Vorsicht ist hier nur insofern geboten als weitestgehend zufällig ist welche der Zeilen mit dem gleichen a du zurückkriegst.)

          --
          Henryk Plötz
          Grüße aus Berlin
          ~~~~~~~~ Un-CDs, nein danke! http://www.heise.de/ct/cd-register/ ~~~~~~~~
          ~~ Help Microsoft fight software piracy: Give Linux to a friend today! ~~