Chris: SQL Abfrage: Count über 2 Spalten

Hallo zusammen,

ich hab mal wieder ein Problem bei einem MySQL Statement. Ich möchte ein Count über 2 Spalten machen, find dazu aber nichts.

Beispiel:

Spalte1-------------Spalte2----

spalte1bsp1---------spalte2bsp1
spalte1bsp1---------spalte2bsp2
spalte1bsp1---------spalte2bsp3

spalte1bsp2---------spalte2bsp1
spalte1bsp2---------spalte2bsp5

Hoffe das ist so verständlich...es ist halt nur ein eindeutiger Eintrag wenn beide SPalten berücksichtigt werden.

Danke im Vorraus

Grüße Chris

  1. Hallo,

    ich hab mal wieder ein Problem bei einem MySQL Statement. Ich möchte ein Count über 2 Spalten machen, find dazu aber nichts.

    Das heisst, du möchtest die Anzahl der Werte zählen, die ungleich NULL sind?

    Was spricht gegen
     SELECT count(Spalte1), count(Spalte2) FROM tabelle

    Kalle

    1. Das heisst, du möchtest die Anzahl der Werte zählen, die ungleich NULL sind?

      Nee, ich möchte alle Zählen bei denen Spalte1 Wert"irgendwas" hat und Spalte2 Wert"irgendwasanderes" hat. Die Einträge in Spalte1 können doppelt sein, genau wie die Werte in Spalte2. Ich möchte also wirklich so zählen das beide berücksichtigt werden. Bei dem Beispiel das ich oben beschrieben habe sollte das Ergebniss sein das es alle Einträge nur 1 mal gibt.

      1. hi,

        Nee, ich möchte alle Zählen bei denen Spalte1 Wert"irgendwas" hat und Spalte2 Wert"irgendwasanderes" hat.

        Du möchtest also die Inhalte der beiden Spalten aneinanderhängen, bevor du danach gruppierst udn zählst?

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo wahsaga,

          Nee, ich möchte alle Zählen bei denen Spalte1 Wert"irgendwas" hat und Spalte2 Wert"irgendwasanderes" hat.

          Du möchtest also die Inhalte der beiden Spalten aneinanderhängen, bevor du danach gruppierst udn zählst?

          bei anderen SQL-Dialekten wäre dies die Lösung, MySQL - und dies verwendet der OP - gibt es jedoch komfortableres, siehe mein Beitrag. Die Frage, wie NULL-Werte behandelt werden sollen, bleibt in beiden Fällen :-)

          Freundliche Grüße

          Vinzenz

          PS: Danke Ilja, dass Du es mir erspart hast, meine Standardnachfrage anzubringen. *bg*

          1. Ok :)

            Schuldigung ich tu mich wirklich immer sehr schwer sowas zu beschreiben. Es eigentlich ziemlich trivial...erstmal zu den NULL Werten, Nein NULL Werte sind ausgeschlossen. In beiden Spalten wird in jedem Fall etwas stehen. MySQL Version: 3.23.58

            Ich versuch es mal anhand eines Beispiels zu erklären:

            |host_name              | service_description                                |
            +-----------------------+---------------------------------------------------+----------+-----------+
            | host1                 |  "service1"                                     |
            | host2                 |  "service1"                                     |
            | host1                 |  "service2"                                           |
            | host3                 |  "service1"                                     |
            | host1                 |  "service3"                                            |

            wie man sehen kann können sich in beiden Spalten Angaben doppelt befinden. Zu jedem host gehören ein oder mehrere services die sich in der Regel wiederholen. Fast jeder host hat zum beispiel den service "PING" Das heißt für mich ist nur die Angabe von beiden Werten eindeutig. Nun können sich aber die Kombinationen aus diesen beiden Werten wiederholen. Also es kann ein Host auch 2 mal mit dem selben Service in der Tabelle stehen und genau deswegen möchte ich diese zählen können. So hoffe das das ein wenig verständlich war...

            1. Hallo Chris,

              Schuldigung ich tu mich wirklich immer sehr schwer sowas zu beschreiben. Es eigentlich ziemlich trivial...erstmal zu den NULL Werten, Nein NULL Werte sind ausgeschlossen. In beiden Spalten wird in jedem Fall etwas stehen. MySQL Version: 3.23.58

              Du suchst COUNT(DISTINCT expr,[expr...]). Wie Du dort nachlesen kannst, gibt es das seit MySQL 3.23.2, somit auch in Deiner Version. Viel Erfolg damit.

              SELECT  
                  host_name,  
                  service_description  
                  COUNT(DISTINCT host_name, service_description),  
              FROM deine_tabelle  
              GROUP BY host_name, service_description
              

              sollte das liefern, was Du benötigst.

              Freundliche Grüße

              Vinzenz

              1. mmh, das funktioniert so irgendwie noch nicht. Das ist das selbe Ergebniss als würde ich einfach nur ein Count(host_name) machen. Die services werden auch dabei nicht brücksichtigt.

              2. yo,

                SELECT

                host_name,
                    service_description
                    COUNT(DISTINCT host_name, service_description),
                FROM deine_tabelle
                GROUP BY host_name, service_description

                  
                ich bin mir selbst nicht sicher, ob ich das problem richtig erfasst habe, stehe irgendwie auf dem schlauch. aber wenn du nicht die gruppierungen zählen willst, sondern die anzahl der verschiedenen datensätze der beiden spalten über die ganze tabelle, dann würde ich folgendes machen.  
                  
                SELECT DISTINCT host\_name, service\_description  
                FROM deine\_tabelle  
                  
                am ende der ausgabe wird nämlich die anzahl der datensätze einfach mit ausgegeben, dessen wert zum beispiel von php mit der funktion mysql\_num\_rows() benutzt werden kann.  
                  
                Ilja
                
                1. SELECT DISTINCT host_name, service_description
                  FROM deine_tabelle

                  Auch das würde mein Problem nicht lösen, weil so ja alle Datensätze gezählt werden. Ich möchte ja die Anzahl der einzelnen Kombinationen haben also:

                  5x host1 in Kombination mit service2
                  1x host1 in Kombination mit service1

                  usw

                  verstehst du was ich meine?

                  1. yo,

                    Auch das würde mein Problem nicht lösen, weil so ja alle Datensätze gezählt werden. Ich möchte ja die Anzahl der einzelnen Kombinationen haben also:

                    5x host1 in Kombination mit service2
                    1x host1 in Kombination mit service1

                    ahhh, jetzt geht die glühbirne an, du willst also nicht doppelte filtern, womit DISTINCT flach fällt, sondern du willst einfach nur nach den beiden spalten gruppieren und dann einen einfach count. also fast das von vinzenz nur ohne DISTINCT.

                    Ilja

                    1. du willst einfach nur nach den beiden spalten gruppieren und dann »» »» einen einfach count. also fast das von vinzenz nur ohne DISTINCT.

                      Genau :) nur leider kann man in ein Count nicht 2 Spalten nehmen...und das ist halt das Problem. Mann muss da irgendwie mit Klammer arbeiten, denk ich mal, aber ich weiß auch nicht wie!

                      1. yo,

                        Genau :) nur leider kann man in ein Count nicht 2 Spalten nehmen...und das ist halt das Problem. Mann muss da irgendwie mit Klammer arbeiten, denk ich mal, aber ich weiß auch nicht wie!

                        musst du doch gar nicht, das COUNT() ist eine aggregat-funktion und bezieht sich automatisch auf die jeweiligen gruppen. und da es keine NULL werte gibt, reicht ein COUNT(*).

                        SELECT spalte1, spalte2, COUNT(*)
                        FROM tabelle
                        GROUP BY spalte1, spalte2

                        Ilja

                  2. Moin!

                    SELECT DISTINCT host_name, service_description
                    FROM deine_tabelle

                    Auch das würde mein Problem nicht lösen, weil so ja alle Datensätze gezählt werden. Ich möchte ja die Anzahl der einzelnen Kombinationen haben also:

                    5x host1 in Kombination mit service2
                    1x host1 in Kombination mit service1

                    Diese Beispielergebisse passen aber nicht mit deinem Beispielinhalt zusammen.

                    In deiner Beispieldatenbank hast du
                    host1 + service1
                    host1 + service2
                    host1 + service3
                    host2 + service1
                    host3 + service1

                    Du kannst also zählen:
                    1. Nur die Hosts: 3x host1, 1x host2, 1x host3
                    2. Nur die Services: 3x service1, 1x service2, 1x service3
                    3. Kombinationen: je 1x host1+service1, host2+service1, host3+service1, host1+service2, host1+service3

                    Doppelte Einträge gibts bei deinem Beispiel nicht, also ist nicht klar, was da rausgefiltert werden soll.

                    Du mußt also dein Beispiel mal deutlicher machen, und du mußt deine gewünschte Ergebnistabelle, die auf diesem Beispiel basiert, angeben.

                    Gibt es beispielsweise eine Zeile mit host1+service1 doppelt? Wenn ja, warum? Und wie soll das gezählt werden?

                    - Sven Rautenberg

                    --
                    "Love your nation - respect the others."
                    1. ja das 2te Beispiel hatte nichts mit dem ersten zu tun, es ging nur um das Verständniss...Sorry

                      1. Kombinationen: je 1x host1+service1, host2+service1, host3+service1, host1+service2, host1+service3

                      ja, genau so will ich das zählen, und wenn ein Eintrag doppelt ist soll da halt 2x host+service stehen, also je nachdem wie oft er halt vorkommt.

                      Wenn ja, warum? Und wie soll das gezählt werden?

                      Es werden jeden Monat hosts und services in diese Tabelle geladen. Es gibt für jede Zeile auch noch eine Spalte in der das Datum steht. Und da es sehr wahrscheinlich ist das ein Großteil der hosts und services auch im neuen Monat wieder geladen werden, können diese halt sehr oft vorkommen. Je nachdem wieviele Monate schon in der Tabelle sind.

            2. yo,

              wie man sehen kann können sich in beiden Spalten Angaben doppelt befinden.

              das, was das verstehen so kompliziert macht ist, dass du nicht eindeutig mitteilst, ob du doppelte daten innerhalb einer oder zweier spalten meinst. den in deinem beispiel, gibt es nur doppelte einträge innerhalb einer spalte, aber nicht über zwei spalten.

              Fast jeder host hat zum beispiel den service "PING" Das heißt für mich ist nur die Angabe von beiden Werten eindeutig.

              das läßt mich wiederum darauf schließen, dass mit doppelt beide spalten gemeint sind, sprich wenn sich in beiden spalten die gleichen werte befinden, das zählt dann wohl als doppelt.

              Also es kann ein Host auch 2 mal mit dem selben Service in der Tabelle stehen und genau deswegen möchte ich diese zählen können.

              ok, wohl über zwei spalten, aber was willst du zählen, die datensätze über zwei spalten, die nicht doppelt sind ? oder wieviele datensätze doppelt sind oder welcher host doppelte services hat ? ....

              So hoffe das das ein wenig verständlich war...

              nicht für mich, ich bin da aber immer ein wenig langsamer. aber in deinem beispiel gibt es nicht einen datensatz, der über beide spalten doppelt ist. mach doch einfach mal das, was ich vorgeschlagen habe, beispieldaten angeben und dann das gewünschte  ergebnis mit begründung aufzeigen.

              Ilja

              1. Ok hier nochmal eine Beispieltabelle (hoffe halbwegs vollständig):

                host_name             |   service_description
                +-----------------------+------------------------+
                | host1                 |  "service1"
                | host1                 |  "service2"
                | host1                 |  "service3"
                | host1                 |  "service1"
                | host2                 |  "service1"
                | host2                 |  "service1"
                | host2                 |  "service1"
                | host2                 |  "service3"
                | host3                 |  "service3"
                | host3                 |  "service2"
                | host3                 |  "service2"
                +-----------------------+-------------------------+

                Ergebnis:

                | host_name             |   service_description  |   count
                +-----------------------+------------------------+--------------
                | host1                 |  "service1"            |    2
                | host1                 |  "service2"            |    1
                | host1                 |  "service3"            |    1
                | host2                 |  "service1"            |    3
                | host2                 |  "service3"            |    1
                | host3                 |  "service3"            |    1
                | host3                 |  "service2"            |    2
                +-----------------------+------------------------+--------------

                1. yo,

                  die lösung dafür haben wir dir bereits gesagt und steht hier:

                  https://forum.selfhtml.org/?t=132808&m=859989

                  Ilja

                  1. Och nöö, oder? :)

                    so simpel ist das? Aber DANKE DANKE an alle Beteiligten!

                    und sorry nochmal für meine verwirrenden Beschreibungen, hab mich wirklich sehr dämlich angestellt.

                    Also noch einen schönen Tag und nochmal ganz großes Dankeschön!

                    liebe Grüße Chris

      2. Das heisst, du möchtest die Anzahl der Werte zählen, die ungleich NULL sind?

        Nee, ich möchte alle Zählen bei denen Spalte1 Wert"irgendwas" hat und Spalte2 Wert"irgendwasanderes" hat.

        ... count ... WHERE Spalte1 <> Spalte2

        oder willst du die Summe der Werte?

        Die Einträge in Spalte1 können doppelt sein, genau wie die Werte in Spalte2. Ich möchte also wirklich so zählen das beide berücksichtigt werden. Bei dem Beispiel das ich oben beschrieben habe sollte das Ergebniss sein das es alle Einträge nur 1 mal gibt.

        also DISTINCT ?

        mir ist vollkommen unklar, was du willst.

        Kalle

  2. yo,

    zum einen ist die version von mysql interessant, die du benutzt. zum anderen verstehe ich wie die anderen auch nicht so richtig, was genau du zählen willst. das beste ist, nicht nur beispieldaten anzugeben, sondern im beispiel mit angeben welche datensätze gezählt werden sollten und welche nicht (mit begründung).

    Ilja

  3. Hallo Chris,

    ich hab mal wieder ein Problem bei einem MySQL Statement. Ich möchte ein Count über 2 Spalten machen, find dazu aber nichts.

    kann ein Wert in einer der Spalten ein NULL-Wert sein?
    Wenn ja, wie willst Du diesen behandeln?

    Der Handbuchabschnitt zu COUNT(expr) und COUNT(DISTINCT expr,[expr... sollte Dir grundsätzlich weiterhelfen. Bei Problemen frag' einfach nochmals nach.

    Freundliche Grüße

    Vinzenz

    PS: Weiß jemand, wie man hier schließende eckige Klammern in einer Link-Beschreibung maskiert?

    1. hi,

      PS: Weiß jemand, wie man hier schließende eckige Klammern in einer Link-Beschreibung maskiert?

      Backslash - as usual ;-)

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hallo

        PS: Weiß jemand, wie man hier schließende eckige Klammern in einer Link-Beschreibung maskiert?
        Backslash - as usual ;-)

        Danke! Da hätte ich auch selbst draufkommen können. Eine Frage schien mir aber einfacher als Trial-and-Error. In der Hilfe hatte ich nämlich nichts dazu gefunden.

        Freundliche Grüße

        Vinzenz

        1. yo,

          Danke! Da hätte ich auch selbst draufkommen können. Eine Frage schien mir aber einfacher als Trial-and-Error.

          das du dich das bei SELFhtml zu sagen traust, wenn da nicht jemand die haie füttert.... ;-)

          Ilja

          1. Hallo Ilja,

            Danke! Da hätte ich auch selbst draufkommen können. Eine Frage schien mir aber einfacher als Trial-and-Error.

            und es funktioniert :-)

            das du dich das bei SELFhtml zu sagen traust, wenn da nicht jemand die haie füttert.... ;-)

            Wieso sollte ich mich das nicht trauen?
            a) Es steht _nicht_ in der Hilfe. Dort hab' ich nachgeschaut.
            b) OK, ich weiß nicht, ob es im Archiv steht.
               Dort hab' ich _nicht_ recherchiert, andererseits konnte ich
               mich nicht an ein Posting dazu erinnern - und ich lese hier viel.

            Damit ist es sicher eine legitime Frage.

            Andererseits kenne ich wochenends auf dem Platz keine Angst, warum sollte ich mich hier fürchten? Eine Berichtigung oder eine Zurechtweisung sollte man sowieso verkraften können - und eine blöde Anmache (ich kann mich da erinnern, dass ausgerechnet Dir das vor kurzem passiert ist ;-)) geht meist das eine Auge rein und das andere Auge wieder raus. Das nennt man dann DEA-Modus (Direct Eye Access). *bg*

            Freundliche Grüße

            Vinzenz

            1. yo,

              Wieso sollte ich mich das nicht trauen?

              du sagst es ja selbst, dass du mit trial on error das problem hättest <selbst> lösen können, dir eine frage hier aber lieber war. ich bin mir sicher, da juckt es so manchen in den fingern, wobei dein guter ruf dir da sicherlich schutz bietet.

              und eine blöde Anmache (ich kann mich da erinnern, dass ausgerechnet Dir das vor kurzem passiert ist ;-)) geht meist das eine Auge rein und das andere Auge wieder raus.

              ja, dieses beispiel, das es ausgrechnet den "robin hood" des forums getroffen hat, wird gerne dazu benutzt, um die eigene meinung gegenüber den "dummen fragenden" noch einmal zu untermauern. allerdings hat beides keinen bezug zueinander, es schließt sich nicht gegenseitig aus.

              Ilja