Ankündigung

Einklappen
Keine Ankündigung bisher.

Count() mit spezieller Abfrage...

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Count() mit spezieller Abfrage...

    Hallo,

    mich würde interessieren, ob folgendes in einer MySql Abfrage möglich wäre.(Konnte es im Titel leider nicht besser beschreiben)

    Um es am Besten zu erklären schreibe ich erstmal auf, wie ich es haben möchte:
    Momentan wird folgendes ausgeführt..

    PHP-Code:
    $sql "SELECT COUNT(DISTINCT re_zusendung.userid) as anzahl FROM benutzer JOIN re_zusendung WHERE re_zusendung.userid = benutzer.id AND benutzer.ref='$kn' AND benutzer.re_bezahlt = 'nein' AND re_zusendung.art = '1'";
    art1        $res=mysql_query($sql);
    art1        $user_rechnung mysql_result($res,"anzahl");

    $sql "SELECT COUNT(DISTINCT re_zusendung.userid) as anzahl FROM benutzer JOIN re_zusendung WHERE re_zusendung.userid = benutzer.id AND benutzer.ref='$kn' AND benutzer.re_bezahlt = 'nein' AND re_zusendung.art = '2'";
            
    $res=mysql_query($sql);
            
    $user_mahnung mysql_result($res,"anzahl");
    //.... 
    Vom System her wird zunächst nach einiger Zeit bei jedem User art='1' in eine DB eingetragen. Einige Zeit später evt. ein neuer DS mit art='2' etc.
    Manchmal kann auch sofort art='3' eingetragen werden.

    Lasse ich mir die Ergebnisse für die 3 Arten eines Users ausgeben erhalte ich:
    art1 1
    art2 1
    art3 1

    Jedoch möchte ich, sollte ein User bei Art3 ausgekommen sein, dass ausgegebenw wird:
    art1 0
    art2 0
    art3 1

    Somit sollte, wenn diese Userid bereits einen DS mit dem höchten Status(in diesem Fall Art3) besitzt, die anderen nicht nochmal "gecountet" werden.

    Ich hoffe ihr versteht was ich meine.
    Mit php wär es kein Prob, wie gesagt interessiert es mich nur, ob es auch mit MySql klappt.
    Über Hilfe oder passende Lektüre würde ich mich freuen!

    Grüße

    Matthias

  • #2
    Ich verstehe die Frage nicht - was hast du denn vor? Browsergame nehm ich an?

    Kommentar


    • #3
      Hmm ok dann verusche ich es nochmal anders.
      Handelt sich aber nicht um ein Browsergame, sondern um eine Statistik.

      In der DB re_zusendung steht:
      id | userid | art
      1 | 2 | rech
      2 | 2 | zahl
      3 | 2 | mahn
      4 | 1 | rech
      5 | 1 | zahl

      In der DB benutzer steht:
      id | ref
      1 | 88
      2 | 88


      Führe ich oben angegebenen Sql-Befehl aus erhalte ich für meine Statistik:
      Geworben User 88:
      rech.: 2
      zahl.: 2
      mahn.: 1

      Gesamt wären es 5, dürfen aber nur 2 sein.

      Es sollte nähmlich so aussehen:
      rech.: 0
      zahl.: 1
      mahn.: 1

      Es sollte immer sozusagen der "höchste" Status gewertet werden. Führt man also

      Code:
      SELECT COUNT(DISTINCT re_zusendung.userid) as anzahl FROM benutzer JOIN re_zusendung WHERE re_zusendung.userid = benutzer.id AND benutzer.ref='88' AND benutzer.re_bezahlt = 'nein' AND re_zusendung.art = 'rech'
      aus, sollte anzahl 0 wiedergeben, da alle ID´s bereits einen höheren Status besitzen (zunächst zahl und danach mahn)

      Hoffe ich hab es verständlich ausgedrückt

      Kommentar


      • #4
        Du hättest auch gleich sagen können, dass es sich um chronologisch-eingetragene Datensätze handelt, bei der immer nur der zuletzt eingetragene Zustand gezählt werden soll. Dann versteht man das Problem auch.

        Ich würde versuchen die Datensätze nach Datum zu sortieren (ob auf- oder absteigend musst du ausprobieren), dann nach User-ID gruppieren (somit sollte je nach Sortierreihenfolge der erste bzw. letzte Datensatz pro User-ID verwendet werden) und die Ergebnismengen dann zu zählen. Allerdings spekuliere ich dann darauf, dass die Sortierung vor und nicht nach der Gruppierung erfolgt. Wie MySQL das handhabt weiß ich jetzt nicht auswendig, aber ein Versuch wäre es wert.

        Kommentar


        • #5
          Mhh ne würde nicht klappen... den es handelt sich nicht umbedingt um eine chronologisch-éingetragene Reihenfolge. Es ist im nach hinein immer noch möglich, dass in die Tabelle wieder "resch" eingetragen wird, obwohl schon zuvor "mahn" eingetragen worden ist.

          Kommentar


          • #6
            Ja gut aber irgendeine Spalte wird ja wohl dafür da sein, die chronologische Reihenfolge festzulegen oder woher willst du sonst wissen welcher Eintrag der letzte war?

            Kommentar


            • #7
              Versteh nun nicht ganz worauf du hinaus willst...
              Spalten zur chronologischen Reihenfolge wären Datum und ID.
              Würde ich es so amchen wie du es sagst und es anch der chronologischen Reihenfolge ordnen lassen, könnte in bestimmten Fällen folgendes rauskommen:

              ID| userid | art | datum
              1 | 4 | rech | 11.04.07
              2 | 4 | zahl | 11.05.07
              3 | 4 | mahn | 11.06.07
              4 | 4 | rech | 12.06.07

              Hier würde ich nun in beiden Fällen (auf oder absortiert) rech erhalten, obwohl mahn höher steht als rech.... oder verstehe ich was falsch?

              Kommentar


              • #8
                Die Sortierung hat keinen Einfluß auf die Gruppierung sondern natürlich nur auf die Ergebnismenge, kleiner Denkfehler von mir.

                Mit folgendem solltest du vorankommen, allerdings weiß ich nicht wie performant das ist. Auf jeden Fall einen Index auf die beteiligten ON-Spalten setzen:
                Code:
                SELECT `r1`.*
                FROM `rechnungsstatus` AS `r1`
                LEFT JOIN `rechnungsstatus` AS `r2`
                ON `r1`.`user_id` = `r2`.`user_id` AND `r1`.`created` < `r2`.`created`
                WHERE `r2`.`created` IS NULL
                Was wird gemacht? Nehme Tabelle `rechnungsstatus` und joine optional den Datensatz aus selbiger Tabelle, dessen Erstellungsdatum `created` größer ist als das eigene. Für den größten Datensatz existiert kein größerer, somit wird NULL gejoint, auf das dann getestet wird.

                Kommentar

                Lädt...
                X