Gero: MySQL - rechnen mit mehreren Feldern und einer Bedingung

Hallo,

ich stehe grad völlig auf dem Schlauch mit einer Abfrage. Ich habe in einer Tabelle folgende Felder:

id , name , bild , status

Das Feld id ist eindeutig. Der Rest kann mehrmals vorkommen. Im Status gibts nur a, b oder c. Nun möchte ich gern wissen, wie oft jeder Benutzer ein Bild mit dem Status c hat und wieviel Prozent das von all seinen Bildern sind.

Ich habe da einiges probiert, aber komm nicht wirklich auf die richtige Spur ;)

SELECT COUNT(name) ..... WHERE status = 'c'

Vielleicht hat jemand von euch eine Idee wie ich wieder auf den richtigen Weg komme ;)

Danke

  1. yo,

    Nun möchte ich gern wissen, wie oft jeder Benutzer ein Bild mit dem Status c hat und wieviel Prozent das von all seinen Bildern sind.

    dazu müsste man wissen, wie sich ein benutzer ausprägt. der name alleine setzt vorraus, dass verschiedene personen nicht den gleichen namen haben dürfen, was unschön wäre. aber vermutlich läuft es bei dir darauf hinaus....

    Ilja

    1. dazu müsste man wissen, wie sich ein benutzer ausprägt. der name alleine setzt vorraus, dass verschiedene personen nicht den gleichen namen haben dürfen, was unschön wäre. aber vermutlich läuft es bei dir darauf hinaus....

      Hi

      der user ist unique.

      1. Hi

        der user ist unique.

        Quatsch.. In dieser Tabelle ist der Name nicht unique. :)

        1. Hallo,

          der user ist unique.

          Von einer Entität "user" hast du bisher nicht gesprochen!

          Quatsch.. In dieser Tabelle ist der Name nicht unique. :)

          Wo ist der Zusammenhang? Ist also "Name" gleichbedeutend mit "User"?

          Du suchst vermutlich grundzipiell erstmal ein

          SELECT Name, Status, COUNT(*) FROM ... GROUP BY Name, Status

          Das gibt dir z.b.

          User1       | c        | 42
          User1       | a        | 21
          User2       | c        | 13

          Zum zweiten suchst du wahrscheinlich ein

          SELECT Status, COUNT(*) FROM ... GROUP BY Status

          Das gibt dir z.b.

          a             | 21
          c             | 55

          Finalemente möchtest du wahrscheinlich beides miteinander verbinden, für sowas benutzt man JOINs. JOIN-Kriterium bei dir wäre wohl das Feld "Status". Jetzt solltest du nur noch schauen, ob dein Datenbanksystem mit Sub-Queries umgehen kann ... à la

          SELECT ....
            FROM (SELECT ... FROM ...) alias1
            INNER JOIN (SELECT .... FROM ...) alias2 ON ... = ...

          Und dies erfährst du in der Dokumentation deines Datenbanksystems.

          Und damit liegt die Lösung deines Problems quasi auf der Hand.

          Ciao, Frank

        2. yo,

          Quatsch.. In dieser Tabelle ist der Name nicht unique. :)

          dann gehen wir mal davon aus, dass der gleiche benutzer denselben user identifiziert. wie gesagt, das ist immer eine recht unschöne sache.

          SELECT name, COUNT(CASE WHEN status = 'c' THEN 1 ELSE NULL END)  Anzahlc,
                 100 * COUNT(*) / COUNT(CASE WHEN status = 'c' THEN 1 ELSE NULL END) Prozent
          FROM tabelle
          GROUP BY name
          ORDER BY name
          ;

          Ilja

    2. dazu müsste man wissen, wie sich ein benutzer ausprägt. der name alleine setzt vorraus, dass verschiedene personen nicht den gleichen namen haben dürfen, was unschön wäre. aber vermutlich läuft es bei dir darauf hinaus....

      Ich habe die Frage schon so verstanden, das er das voraussetzt.

      Und dann würde ich mir Gedanken über Gruppierung machen.

      Gruß, Tibor

  2. Mahlzeit Gero,

    Vielleicht hat jemand von euch eine Idee wie ich wieder auf den richtigen Weg komme ;)

    Spontan fällt mir da so etwas in der Richtung ein:

    SELECT s.*  
    ,      round(s.anzahl_status / s.anzahl_name * 100, 2) AS anteil  
      FROM (  
            SELECT t2.name  
            ,      t2.status  
            ,      n.anzahl_name  
            ,      COUNT(t2.status) AS anzahl_status  
              FROM tabelle t2  
              JOIN (  
                    SELECT t1.name  
                    ,      COUNT(t1.name) AS anzahl_name  
                      FROM tabelle t1  
                     GROUP BY t1.name  
                    ) AS n ON t2.name = n.name  
             GROUP BY t2.name  
            ,         t2.status  
            ,         n.anzahl_name  
             ORDER BY t2.name  
            ) AS s
    

    Ist sicherlich stark verbesserungsbedürftig, aber das Prinzip sollte zu erkennen sein.

    MfG,
    EKKi

    --
    sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|