Knud: (MySQL) Abfrage-Problem mit zwei Distincts

Hallo,

ich hab ein problem bei einer MySQL-Abfrage. Bisher sieht meine abfrage so aus:

select distinct abstimmung,count(*) as anzahl from abstimmung group by abstimmung order by anzahl DESC

Jetzt würd ich aber noch gerne ein weiteres Feld in das Distinct einbeziehen. Also sowohl das Feld abstimmung als auch noch weiteres Feld namens ident.
Ich möchte, dass nur eine Abstimmung pro Ident gezählt wird.

Wie kombiniere ich denn sowas?

select distinct abstimmung,count(*) as anzahl from abstimmung group by abstimmung,ident order by anzahl DESC

wirft für mich nicht nachvollziehbare Ergebnisse nach sich.

Gruß,

Knud

  1. Hi,

    select distinct abstimmung,count(*) as anzahl from abstimmung group by abstimmung order by anzahl DESC

    Du gruppierst hier nach abstimmung, reduzierst jede Gruppe auf die Anzahl der Zeilen und den Gruppenbezeichner, also jeweils exakt einen Datensatz, und holst Dir dann nur die verschiedenen Gruppenbezeichner, von denen jeder ohnehin nur einmal vorkommt.

    Soll heißen: Das DISTINCT hat hier absolut keinen Effekt. Lass es weg.

    Jetzt würd ich aber noch gerne ein weiteres Feld in das Distinct einbeziehen.

    Nein, das möchtest Du nicht; Du möchtest es in das GROUP BY einbeziehen. Und das kannst Du ohne weiteres machen. Füge den Gruppenbezeichner auch der SELECT-Liste zu, damit Du erkennst, was da eigentlich passiert.

    Ich möchte, dass nur eine Abstimmung pro Ident gezählt wird.

    Und welche? Das musst Du der DB schon mitteilen; sie macht nicht einfach "irgendwas".

    select distinct abstimmung,count(*) as anzahl from abstimmung group by abstimmung,ident order by anzahl DESC

    wirft für mich nicht nachvollziehbare Ergebnisse nach sich.

    Es wird Dir so viele Ergebnisse liefern, wie es Kombinationen von abstimmung und ident gibt. Da Du ident nicht mitselektierst, siehst Du natürlich keinen Unterschied.

    Cheatah

    1. Hi,

      Soll heißen: Das DISTINCT hat hier absolut keinen Effekt. Lass es weg.

      Hmm, Du hast recht, hatte das ganze bisher irgendwie flasch verstanden.

      Nein, das möchtest Du nicht; Du möchtest es in das GROUP BY einbeziehen. Und das kannst Du ohne weiteres machen. Füge den Gruppenbezeichner auch der SELECT-Liste zu, damit Du erkennst, was da eigentlich passiert.

      hab ich gemacht:  select ident,abstimmung,count(*) as anzahl from abstimmung group by ident,abstimmung

      Nur hab ich trotzdem noch doppelte Idents.

      In meiner Abstimmungstabelle stehen prinzipiell nur 2 relevante Felder:
      das Identfeld (Ipadresse) und für was gestimmt wurde: Farbe grün,blau,gelb...

      Jetzt würd ich eben gerne wissen, wie oft was gewählt wurde, aber mehrfach-Abstimmungen nicht zählen.

      Gruß,

      Knud

      1. Hi,

        hab ich gemacht:  select ident,abstimmung,count(*) as anzahl from abstimmung group by ident,abstimmung
        Nur hab ich trotzdem noch doppelte Idents.

        ja; aber keine doppelte ident-abstimmung-Kombination.

        Jetzt würd ich eben gerne wissen, wie oft was gewählt wurde, aber mehrfach-Abstimmungen nicht zählen.

        wie definierst Du "Mehrfachabstimmung"? Identische Datensätze? Identischer ident-Inhalt? Letzteres wäre zumindest faktisch falsch, weil ident nur die IP-Adresse beinhaltet und damit als Indiz für einzelne User keinesfalls ausreicht. Vor allem musst Du in dem Fall aber absolut klar definieren, welcher Datensatz denn bei identischen ident-Inhalten gewählt werden soll - ohne eine solche Definition _kann_ kein Ergebnis kommen. Und nein, "der erste" macht in einer unsortierten Menge, die eine Datenbank-Tabelle per definitionem darstellt, keinen Sinn.

        Cheatah

        1. Hi,

          wie definierst Du "Mehrfachabstimmung"? Identische Datensätze? Identischer ident-Inhalt? Letzteres wäre zumindest faktisch falsch, weil ident nur die IP-Adresse beinhaltet und damit als Indiz für einzelne User keinesfalls ausreicht. Vor allem musst Du in dem Fall aber absolut klar definieren, welcher Datensatz denn bei identischen ident-Inhalten gewählt werden soll - ohne eine solche Definition _kann_ kein Ergebnis kommen. Und nein, "der erste" macht in einer unsortierten Menge, die eine Datenbank-Tabelle per definitionem darstellt, keinen Sinn.

          Die IP-Adresse ist bei mir eindeutig, da nur im Intranet und fest vergeben. Insofern doch identischer ident-Inhalt.

          wenn ich die Abfrage
          select abstimmung,ident,count(*) as anzahl from abstimmung group by ident,abstimmung order by anzahl DESC
          noch so eingrenzen könnte, dass ich am Ende nur noch gezählt bekomme, wieoft welche Abstimmung vorkommt.
          Also sozusagen auf das Ergebnis nochmal ein group by abstimmung.

          Ich komme einfach nicht selber drauf, da fehlt mir wohl noch einiges an Grundverständnis. Vielleicht könntest Du mir die Abfrage nennen und mir nochmal erklären, was wodurch erreicht wird?

          Ich würd das echt gern mal checken.

          Gruß,

          Knud

          1. Hi,

            Die IP-Adresse ist bei mir eindeutig, da nur im Intranet und fest vergeben. Insofern doch identischer ident-Inhalt.

            solche Informationen sind für die Fragestellung äußerst relevant. In einem Intranet herrschen völlig andere Regeln als im Internet.

            Überlegenswert ist in diesem Fall beispielsweise auch, ob Du doppelte Werte überhaupt zulassen willst - ein günstig gewählter Primary Key oder eine Unique-Spaltenkombination wirkt Wunder.

            wenn ich die Abfrage
            select abstimmung,ident,count(*) as anzahl from abstimmung group by ident,abstimmung order by anzahl DESC
            noch so eingrenzen könnte, dass ich am Ende nur noch gezählt bekomme, wieoft welche Abstimmung vorkommt.
            Also sozusagen auf das Ergebnis nochmal ein group by abstimmung.

            Du hast noch immer nicht definiert, welche der n möglichen Werte von abstimmung im Falle von n Einträgen eines ident gewählt werden soll. Ohne diese Definition

            * ergibt die Frage keinen Sinn. *

            Daher existiert auch keine entsprechende Abfrage.

            Cheatah

            1. Hi,

              Du hast noch immer nicht definiert, welche der n möglichen Werte von abstimmung im Falle von n Einträgen eines ident gewählt werden soll. Ohne diese Definition

              * ergibt die Frage keinen Sinn. *

              Daher existiert auch keine entsprechende Abfrage.

              Hmm, versuche es anhand eines Beispiels:

              10.1.1.10 blau
              10.1.1.12 gruen
              10.1.1.9  blau
              10.1.1.9  blau
              10.1.1.9. blau
              10.1.1.11 gelb
              10.1.1.13 blau
              10.1.1.13 gruen

              Die Anzeige soll jetzt so aussehen:

              blau 3
              gelb 1
              gruen 2

              d.h. doppelte (wie bei 10.1.1.9) werden ignoriert, aber unterschiedliche Farben pro IP (10.1.1.13) werden gezählt.

              Sorry, wenn ich mich nicht so verständlich ausdrücken kann, ich bemühe mich.

              Gruß,

              Knud

              1. Hi,

                ich sortiere mal nach IP, und füge Nummern hinzu:

                1. 10.1.1.9  blau
                2. 10.1.1.9  blau
                3. 10.1.1.9. blau
                4. 10.1.1.10 blau
                5. 10.1.1.11 gelb
                6. 10.1.1.12 gruen
                7. 10.1.1.13 blau
                8. 10.1.1.13 gruen

                Die Anzeige soll jetzt so aussehen:
                blau 3
                gelb 1
                gruen 2

                Welche Zeilennummern sollen also gezählt worden sein?

                d.h. doppelte (wie bei 10.1.1.9) werden ignoriert, aber unterschiedliche Farben pro IP (10.1.1.13) werden gezählt.

                Wie definierst Du "doppelte"? Für mich sind das "alle, die mindestens zwei Mal vorkommen". Also beispielsweise die ersten drei Zeilen - und zwar _alle drei_.

                Sorry, wenn ich mich nicht so verständlich ausdrücken kann, ich bemühe mich.

                Keine Bange, wir kommen noch da hin, wo Du hinwillst :-)

                Cheatah