alfie: MySQL 5.0.27: Anzahl nach zwei Feldern ermitteln

Hallo!

Ich habe eine Tabelle mit Zitaten verschiedener Autoren. Mit
SELECT COUNT(autor) FROM zitate GROUP BY autor
und anschließendem mysql_num_rows in PHP kann ich mir die Anzahl der Autoren ausgeben lassen.
Jetzt möchte ich die Autoren nach Geschlecht ermitteln (männlich, weiblich, undefiniert - etwa bei gemischtgeschlechtlichen Gruppen oder Anonymi). Jeder Datensatz hat dazu ein Feld 'sex', aber wie formuliere ich die passende Abfrage (Beispiel: 250 Zitate von 100 Autoren; 55 Männer, 40 Frauen, 5 nicht definiert)?

mfg Alfie

  1. Hallo!

    Ein Bild sagt mehr als tausend schöne Worte:

    id | autor | sex
    ----+-------+----
      1 |   1   |  1
      2 |   1   |  1
      3 |   2   |  2
      4 |   3   |  2
      5 |   4   |  0

    Also 5 Zitate von 4 Autoren (1 Mann, 2 Frauen, 1 nicht def.)

    mfg Alfie

  2. Hi,

    Ich habe eine Tabelle mit Zitaten verschiedener Autoren. Mit
    SELECT COUNT(autor) FROM zitate GROUP BY autor
    und anschließendem mysql_num_rows in PHP kann ich mir die Anzahl der Autoren ausgeben lassen.
    Jetzt möchte ich die Autoren nach Geschlecht ermitteln (männlich, weiblich, undefiniert - etwa bei gemischtgeschlechtlichen Gruppen oder Anonymi). Jeder Datensatz hat dazu ein Feld 'sex', aber wie formuliere ich die passende Abfrage (Beispiel: 250 Zitate von 100 Autoren; 55 Männer, 40 Frauen, 5 nicht definiert)?

    Du willst vermutlich nach sex und autor gruppieren (oder umgekehrt? Ausprobieren), mit Zwischensummen (WITH ROLLUP).

    cu,
    Andreas

    --
    Warum nennt sich Andreas hier MudGuard?
    O o ostern ...
    Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
    1. Hallo Andreas!

      Du willst vermutlich nach sex und autor gruppieren (oder umgekehrt? Ausprobieren), mit Zwischensummen (WITH ROLLUP).

      Schau einmal in meinen Ergänzungspost (mein 1. war vermutlich etwas wirr). Mit ROLLUP bekomme ich eine zusätzliche Zeile - dann liefert mir mysql_num_rows 5 Autoren statt 4.

      mfg Alfie

      1. Hi,

        Du willst vermutlich nach sex und autor gruppieren (oder umgekehrt? Ausprobieren), mit Zwischensummen (WITH ROLLUP).
        Schau einmal in meinen Ergänzungspost (mein 1. war vermutlich etwas wirr). Mit ROLLUP bekomme ich eine zusätzliche Zeile - dann liefert mir mysql_num_rows 5 Autoren statt 4.

        Dann nimm halt das Zusatz-Ergebnis aus dem result statt der num-rows.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
        1. Hallo Andreas!

          Dann nimm halt das Zusatz-Ergebnis aus dem result statt der num-rows.

          Irgendwie bin ich heute vernagelt...

          id | autor | sex
          ----+-------+----
            1 |   1   |  1
            2 |   1   |  1
            3 |   2   |  2
            4 |   3   |  2
            5 |   4   |  0

          SELECT COUNT(autor) autor, sex FROM zitate GROUP BY sex WITH ROLLUP

          liefert mir diesen Array:

          row0 | row1
          ------+----
            1   |  0     <- 1 Zitat undefinierter Herkunft
            2   |  1     <- 2 von Frauen
            2   |  2     <- 2 von Männern
            5   | NULL

          Wie muss ich die Abfrage formulieren, um diesen Array zu bekommen?

          row0 | row1
          ------+----
            1   |  0     <- 1 undefiniertes Geschlecht
            2   |  1     <- 2 Frauen
            1   |  2     <- 1 Mann
            4   | NULL

          mfg Alfie

  3. moin,

    Ich habe eine Tabelle mit Zitaten verschiedener Autoren. Mit
    SELECT COUNT(autor) FROM zitate GROUP BY autor
    und anschließendem mysql_num_rows in PHP kann ich mir die Anzahl der Autoren ausgeben lassen.

    erstens macht es in dieser form keinen sinn, erst nach autoren zu gruppieren und dann die spalte in den count mit einzubauen, verwende in solchen fällen COUNT(*) anstelle von COUNT(autor).

    außerdem ist noch ungeklärt, ob das feld autor den Constraint NOT NULL hat. ist dies nicht der fall, so würde dir mit mysql_num_rows ein falscher wert ausgegeben werden.

    Jetzt möchte ich die Autoren nach Geschlecht ermitteln (männlich, weiblich, undefiniert

    ich beziehe mich hier auch auf deinen ergänzungspost (da ist ein kleiner fehler 0 anstelle von 1 ist höchtwahrscheinlich nicht def.). leider hast du bei den beispieldaten nicht genau spezifziert, wie das ergebnis nun aussehen soll. willst du die infomrationen in nur einem datensatz zurück haben, verwende in solchen fällen DISTINCT in den COUNT funktionen, ohne vorher zu gruppieren.

    SELECT COUNT(*) Zitate,
           COUNT(DISTINCT autor) Autoren,
           COUNT(CASE sex WHEN 1 THEN 1 ELSE NULL END) Männer,
           COUNT(CASE sex WHEN 2 THEN 1 ELSE NULL END) Frauen,
           COUNT(CASE sex WHEN 0 THEN 1 ELSE NULL END) Frauen,
    FROM zitate
    ;

    willst du mehr als einen Datensatz zurück bekommen, solltest du noch mal genau spezifizieren, wie das ergebnis aussehen soll.

    Ilja