Linuchs: Kann ein GROUP BY mehrere COUNT() haben?

problematische Seite

Lasst mir noch mal eben Nachdenk-Zeit bis 12:30 Uhr, bevor ihr antwortet

Moin,

für einen Veranstaltungskalender möchte ich die Nationen, Anzahl künftiger Termine und Orte zählen für die Angabe

x Nationen, y Orte, z Events

Anzahl Orte und Anzahl Events sind gleich, das kann nicht stimmen.

SELECT
 COUNT(trm1.id) anzahl_events
,COUNT(ort1.id) anzahl_orte
,ort1.land_kz
FROM        (bia_termine trm1
            ,bia_orte ort1 )
WHERE       trm1.owner_id = '1'
AND         ort1.id = trm1.ort_id

AND        (trm1.gesperrt_bis IS NULL OR trm1.gesperrt_bis <= NOW())
AND         trm1.intern_kz  = 0
#AND         trm1.tag        >= CURDATE() OR  trm1.tag_bis >= CURDATE()
GROUP BY    ort1.land_kz
  $res_nationen  = @mysql_query( $q, $conn_id ); zeigSqlFehler( $q, $conn_id );
  if ( @mysql_num_rows( $res_nationen )) {
    $anzahl_nationen  = @mysql_num_rows( $res_nationen );
    $nationen_links   = "";
    $gesamt_orte      = 0;
    $gesamt_events    = 0;
    while ( $row  = mysql_fetch_assoc( $res_nationen ) ) {
      $nationen_links .=  '<a href="/?nation=' . $row['land_kz'] . '&amp;lg=' . $bia_lg . '">' . $row['land_kz'] . '</a> (' . $row['anzahl_events'] . ') &nbsp;';
      $gesamt_orte    +=  $row['anzahl_orte'];
      $gesamt_events  +=  $row['anzahl_events'];
    }
  }

Stehe auf dem Schlauch, wo ist der Fehler?

Wenn die auskommentierte SQL-Zeile aktiv ist, erhöht sich die Trefferzahl, sie müsste eigentlich kleiner werden, weil vergangene Events entfallen.

Linuchs

  1. problematische Seite

    Hallo Linuchs,

    du stellst zwei Fragen. (1) COUNT, (2) Trefferzahl.

    Zu 1: COUNT(*) zählt alle Sätze in der Table, oder bei Einsatz von GROUP BY in der Gruppe. COUNT(feldname) tut das auch, nur ohne die NULL Werte. COUNT(DISTINCT feldname) zählt alle unterschiedlichen Werte dieses Feldes in der Table (außer NULL), oder bei Einsatz von GROUP BY in der Gruppe. Zumindest ist das in meinem lokalen Spielzeug MySQL 5.6 so (bei dem ich seit Ewigkeiten zu faul zum updaten bin)

    (Kursiver Teil nach Dedlfix' Hinweis ergänzt)

    Zu 2: Die Trefferzahl erhöht sich, weil AND stärker bindet als OR. D.h. wenn Du auskommentierst, steht da WHERE X AND Y AND Z. Wenn Du die Zeile hinzunimmst, steht da WHERE (X AND Y AND Z AND A) OR B. Die Klammer steht da nicht, aber MySQL denkt sie sich. Vermutlich möchtest Du WHERE X AND Y AND Z AND (A OR B).

    Rolf

    --
    sumpsi - posui - obstruxi
    1. problematische Seite

      Hallo Rolf,

      bevor ich deine Antwort lesen konnte, habe ich sie mit dem siebten Sinn schon empfangen und beide Probleme behoben, obwohl ich vorher mehr als halbe Stunde drüber gebrütet habe.

      Das Ergebnis dieser Eingebung konnte ich euch nicht mehr mitteilen, weil wieder mal das Speichern meiner Bearbeitung verboten war. Deine Antwort war schneller.

      Danke.

      1. problematische Seite

        Hallo

        Das Ergebnis dieser Eingebung konnte ich euch nicht mehr mitteilen, weil wieder mal das Speichern meiner Bearbeitung verboten war. Deine Antwort war schneller.

        Im Sinne der Nachvollziehbarkeit eines Threads ist es um Längen besser, sich bei Bedarf selbst zu antworten als das Eröffnungsposting und damit die Fragestellung zu bearbeiten.

        Bei Ergänzungen sieht das meiner Meinung nach etwas anders aus. Wenn man einen Aspekt vergessen hat oder direkt nach dem abschicken des Postings Fehler in der Rechtschreibung oder – passiert mir gern nach dem umformulieren ganzer Abschnitte – dem Satzbau findet, sollte man sie per Bearbeitung beheben, gerade, wenn die Verständlichkeit des Postings davon profitiert. Größere Änderungen sollte man aber eher als Selbstgespräch (Antwort auf sich selbst) vornehmen und im Betreff der Antwort auf die Ergänzung hinweisen. Das ist besser, als sich beim abschicken der Bearbeitung des (Eröffnungs)-Postings darüber zu ärgern, dass einem jemand mit einer Antwort dazwischen gefunkt hat oder die Bearbeitungszeit abgelaufen ist.

        Tschö, Auge

        --
        Ein echtes Alchimistenlabor musste voll mit Glasgefäßen sein, die so aussahen, als wären sie beim öffentlichen Schluckaufwettbewerb der Glasbläsergilde entstanden.
        Hohle Köpfe von Terry Pratchett
  2. problematische Seite

    Tach!

    für einen Veranstaltungskalender möchte ich die Nationen, Anzahl künftiger Termine und Orte zählen für die Angabe

    x Nationen, y Orte, z Events

    Anzahl Orte und Anzahl Events sind gleich, das kann nicht stimmen.

    Ja, denn COUNT() zählt die Mitglieder pro Gruppe. Die Zahl ist eben immer gleich, egal wie oft du zählst. Unterschiedliche Zahlen bekommst du nur, wenn du COUNT() einen Spaltennamen statt * gibst, denn dann zählen nur die Datensätze ohne NULL in diesem Feld.

    Was du vermutlich möchtest, ist die Länder zu befragen und dazu in einzelnen Correlated Subquerys die entsprechenden Datensätze der anderen Tabellen zu zählen.

    dedlfix.

    1. problematische Seite

      Hallo dedlfix,

      COUNT(name) - denn dann zählen nur die Datensätze ohne NULL in diesem Feld.

      Ah! Das war's.

      Rolf

      --
      sumpsi - posui - obstruxi
    2. problematische Seite

      Ja, denn COUNT() zählt die Mitglieder pro Gruppe.

      Mißverständlich. Wenn Berlin fünf Events hat, wird Berlin fünfmal gezählt.

      Das - mir kurzfristig entfallene - Zauberwort heißt DISTINCT:

      ,COUNT(DISTINCT ort1.id)  anzahl_orte
      

      Miserabler Magier, der seine Sprüche vergisst. Nur gut, dass ich mit euch nur zwei Publikümer habe.

      Linuchs

      1. problematische Seite

        Hallo Linuchs,

        mir kurzfristig entfallene

        Es hatte mich auch gewundert, dass Du das nicht gewusst haben solltest.

        Programmiersenioren brauchen halt schonmal einen kleinen Stups 😉
        (so wie ich mit der NULL im COUNT(feld))

        Rolf

        --
        sumpsi - posui - obstruxi
        1. problematische Seite

          Programmiersenioren brauchen halt schonmal einen kleinen Stups 😉
          (so wie ich mit der NULL im COUNT(feld))

          Schreibt der, der IMHO hier aktuell mit (wenn nicht vielleicht in Summe die) besten Beiträge leistet. Chapeau!

          1. problematische Seite

            Hallo,

            Programmiersenioren brauchen halt schonmal einen kleinen Stups 😉
            (so wie ich mit der NULL im COUNT(feld))

            Schreibt der, der IMHO hier aktuell mit (wenn nicht vielleicht in Summe die) besten Beiträge leistet. Chapeau!

            es ist schwierig bis unmöglich, die Qualität der Antworten von verschiedenen Teilnehmern gegeneinander abzuwägen, denn sie alle haben ihre Themenschwerpunkte, bei denen sie besonders gut sind. Und natürlich ist die Qualität einer Antwort auch von der Tagesform abhängig.

            Ich denke aber auch, Rolf verdient für seine Beiträge durchaus das Prädikat "besonders wertvoll".

            Live long and pros healthy,
             Martin

            --
            Home is where my beer is.
        2. problematische Seite

          Hallo Rolf,

          Programmiersenioren

          weißt du, im Alter entwickelt sich Weisheit, die weit hinausgeht über das Vokabular von nirgendwo gesprochenen Programmiersprachen. Selbst in Latein und altgriechisch unterhalten sich vermutlich mehr Menschen bei einem Glas Wein als in SQL oder PHP.

          Diese digitalen Sprachen haben eine extrem kurze Halbwertzeit. Ich lernte mal RPG und die Beurteilung der Lehrenden hing im vergangenen Jahrtausend davon ab, dass ich eine Prüfung bestand. EDV-Kaufmann.

          Die Jahrtausende wechselten, ich wurde weiser und heute kann keine Sau mehr erklären, was ein EDV-Kaufmann eigentlich kauft. Als Insider gebe ich einen Tipp: Nudeln, Milch, Joghurt.

          Immer noch bin ich zu jugendlich-ungeduldig, wenn mein Gesprächspartner, der Server, mich nicht verstehen will. Statt eine halbe Stunde hektisch mit untauglichen Sprüchen um Herausgabe von Daten zu winseln, sollte ich mich zurückziehen und meditieren.

          Wenn das nicht klappt, gibt es hier bei selfHTML Tag und Nacht ein paar Gurus, die vermitteln können.

          Dafür danke ich euch.

          Linuchs