Markus: MySQL - Größe der Ergebnismenge ermitteln

Hallo Forum!

Ich versuche grade die Ergebnismenge eines SQL-Querys zu ermittel und irgendwie hat mich das Archiv hier auch nicht weitergebracht.

Ich setze folgendes Query ab

SELECT user.id, user.name
FROM user
JOIN buddies ON user.id = buddies.buddie
JOIN sessions ON buddies.buddie = sessions.id
WHERE sessions.expires > NOW()
GROUP BY user.id

und erhalte die Ergebnismenge:
 id      name
10005  Karl
10007  Ernst
10008  Kurt

nun möchte ich aber wissen wieviele Ergebnisse zutreffen, ein COUNT(user.id) im SELECT bringt mich allerding hier nicht weiter - wie kann ich das lösen?

Ich könnte im Script mein Array durchzählen, darauf möchte ich allerdings eigentlich aus Performance-Gründen verzichten.

Gruß, Markus

  1. yo,

    nun möchte ich aber wissen wieviele Ergebnisse zutreffen, ein COUNT(user.id) im SELECT bringt mich allerding hier nicht weiter - wie kann ich das lösen?

    ich nehme mal an, weil du nicht den count der jeweiligen gruppierungen haben willst, sondern wissen willst, wieviele gruppierung es gibt ? mach eine zweite abfrage draus, die das zählt.

    SELECT COUNT(DISTINCT user.id)
    FROM user
    JOIN buddies ON user.id = buddies.buddie
    JOIN sessions ON buddies.buddie = sessions.id
    WHERE sessions.expires > NOW()
    ;

    Ich könnte im Script mein Array durchzählen, darauf möchte ich allerdings eigentlich aus Performance-Gründen verzichten.

    bestimmte sprachen stellen dir die gewünschte information zur verfügung, so wie php mit mysql_num_rows.

    kleiner hinweis, mysql hat die dumme angewohntheit, bei deiner abfrage keine fehler anzuzeigen. ich rate dir aber an, über alle spalten zu gruppieren, also auch über den namen.

    Ilja

    1. .
      .
      .

      SELECT COUNT(DISTINCT user.id)
      FROM user
      JOIN buddies ON user.id = buddies.buddie
      JOIN sessions ON buddies.buddie = sessions.id
      WHERE sessions.expires > NOW()
      ;

      .
      .
      .
      Okay! Vielen Dank für den Tip. Also kann ich das schlicht nicht mit einer einzigen Abfrage erreichen.

      Dann kann ich auch die Größe meines Arrays im Perl Script ermitteln, ist wesentlich weniger Aufwand, denke ich!

      Gruß, Markus

      1. yo,

        Also kann ich das schlicht nicht mit einer einzigen Abfrage erreichen.

        doch, auch das würde gehen, ist aber nicht ratsam. man sollte sich vor augen führen, dass es manchmal besser ist, zwei abfragen draus zu machen, als alles in einer unterzubringen. aber ein tipp, fallst du eine  nur eine haben willst, verbinden die beiden abfragen (den count und die gruppiuerung) in einem UNION ALL miteinander. bedenke dabei, dass die spaltenanzahl gleich sein muss (dummy spalte bei dem count). dann hast du alles in einer abfrage un der erste record gibt dir den count wieder.

        Dann kann ich auch die Größe meines Arrays im Perl Script ermitteln, ist wesentlich weniger Aufwand, denke ich!

        wie gesagt, eventuell stellt perl dafür schon eine funktionalität zur verfügung, so dass sich das problem von alleine löst.

        Ilja

        1. yo,

          Also kann ich das schlicht nicht mit einer einzigen Abfrage erreichen.

          doch, auch das würde gehen, ist aber nicht ratsam. man sollte sich vor augen führen, dass es manchmal besser ist, zwei abfragen draus zu machen, als alles in einer unterzubringen. aber ein tipp, fallst du eine  nur eine haben willst, verbinden die beiden abfragen (den count und die gruppiuerung) in einem UNION ALL miteinander. bedenke dabei, dass die spaltenanzahl gleich sein muss (dummy spalte bei dem count). dann hast du alles in einer abfrage un der erste record gibt dir den count wieder.

          Dann kann ich auch die Größe meines Arrays im Perl Script ermitteln, ist wesentlich weniger Aufwand, denke ich!

          wie gesagt, eventuell stellt perl dafür schon eine funktionalität zur verfügung, so dass sich das problem von alleine löst.

          Ilja

          okay, vielen Dank!

    2. echo $begrüßung;

      Ich könnte im Script mein Array durchzählen, darauf möchte ich allerdings eigentlich aus Performance-Gründen verzichten.
      bestimmte sprachen stellen dir die gewünschte information zur verfügung, so wie php mit mysql_num_rows.

      Diese Funktionalität kann PHP nur deshalb bieten, weil es beim Ausführen von mysql_query() gleich noch die Ergebnismenge von der Datenbank vollständig abholt und zwischenspeichert. Wenn es um das reine Zählen geht und man die Datensätze nicht braucht, sollte man auf mysql_num_rows() ...

      [...] eigentlich aus Performance-Gründen verzichten.

      echo "$verabschiedung $name";

  2. Hi,

    Ich setze folgendes Query ab

    sieht wie der klägliche Versuch eines "User online"-Zählers aus.

    nun möchte ich aber wissen wieviele Ergebnisse zutreffen, ein COUNT(user.id) im SELECT bringt mich allerding hier nicht weiter

    Warum nicht?

    Ich könnte im Script mein Array durchzählen,

    Bist Du sicher, dass die dem Script verfügbare Schnittstelle nicht per se eine entsprechende Funktionalität mitliefert?

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      Ich setze folgendes Query ab

      sieht wie der klägliche Versuch eines "User online"-Zählers aus.

      sieht eher nach einem 'kläglichen' Versuch eines "Buddie-online"-Zählers aus.

      nun möchte ich aber wissen wieviele Ergebnisse zutreffen, ein COUNT(user.id) im SELECT bringt mich allerding hier nicht weiter

      Warum nicht?

      Weil der je 1 für jede Gruppierung zählt und im Beispielfall halt NICHT 3 ausgibt sondern je Resultat 1

      Ich könnte im Script mein Array durchzählen,

      Bist Du sicher, dass die dem Script verfügbare Schnittstelle nicht per se eine entsprechende Funktionalität mitliefert?

      Nein, bin ich nicht!

      Cheatah

      Markus

      1. Hi,

        sieht wie der klägliche Versuch eines "User online"-Zählers aus.
        sieht eher nach einem 'kläglichen' Versuch eines "Buddie-online"-Zählers aus.

        ich vermute, ein "Buddie" ("Buddy"?) ist ebenfalls ein User. Damit versuchst Du nach wie vor, HTTP Informationen zu entlocken, die es nicht bietet.

        nun möchte ich aber wissen wieviele Ergebnisse zutreffen, ein COUNT(user.id) im SELECT bringt mich allerding hier nicht weiter
        Warum nicht?
        Weil der je 1 für jede Gruppierung zählt und im Beispielfall halt NICHT 3 ausgibt sondern je Resultat 1

        Wendest Du die Gruppenfunktion auf die Tabelle an oder auf Gruppierungen der Tabelle?

        Bist Du sicher, dass die dem Script verfügbare Schnittstelle nicht per se eine entsprechende Funktionalität mitliefert?
        Nein, bin ich nicht!

        Was hast Du getan, um dies zu ändern?

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
        1. ich vermute, ein "Buddie" ("Buddy"?) ist ebenfalls ein User. Damit versuchst Du nach wie vor, HTTP Informationen zu entlocken, die es nicht bietet.

          Das stimmt nicht ganz. Ich nutze lediglich eine weitverbreitet Möglichkeit zu schätzen ob ein User Eingeloggt ist oder nicht. Außerdem hatte ich danach NICHT gefragt!

          Ende der Diskussion!

    2. Wenn ich eine Meinung bezüglich meines Programmierstils gewünscht hätte, hätte ich das Ganze wohl nicht unter dem Themenbereich "Datenbank" und sicher mit einem anderen Titel geposted!

      Ich finde Deine Äußerung absolut fehl am Platz und des Themas entsprechend auch sehr unqualifiziert! Wenn Du meinst dass Du der Programmierer Gott bist, solltest Du Dich vielleicht drauf beschränken nur noch anspruchsvolle Postings zu beantworten!

      MfG Markus.