Kann ein GROUP BY mehrere COUNT() haben?
Linuchs
- sql
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'] . '&lg=' . $bia_lg . '">' . $row['land_kz'] . '</a> (' . $row['anzahl_events'] . ') ';
$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
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
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.
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
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.
Hallo dedlfix,
COUNT(name) - denn dann zählen nur die Datensätze ohne NULL in diesem Feld.
Ah! Das war's.
Rolf
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
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
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!
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
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