Andere/bessere Variante möglich?

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

  • Andere/bessere Variante möglich?

    Hallo zusammen,


    Ich suche eine bessere Variante für ein Statistikformular.
    Ich habe eine Statistik, die einmal im Monat (normalerweise am Monatsanfang - aber das spielt keine Rolle) von Hand eingetragen wird. Hierzu gibt es eine select-bar zum auswählen des gewünschten Benutzers. Da es in meinen Augen aber zu nervig ist, nach jedem Eintrag wieder im select zum Usernamen zu scrollen, dachte ich mir, es müsste doch möglich sein die so zu gestalten das nur solche Usernamen dort aufgelistet werden die zum entsprechenden Monat noch keinen Statistikeintrag haben.
    Soweit so gut.., ich grübelte also und bastelte mir etwas sehr seltsames zusammen was ansich auch funktioniert. Problem ist nur, dass es in meinen Augen viel zu viel Aufwand dafür ist, dass müsste doch auch kürzer gehen (ggf. sogar mit einem einzigen Query?)

    Tabellen (gekürzt auf die notwendigen Inhalte):

    members
    ------------
    - userid
    - username

    statistik
    -----------
    - userid (userid aus tabelle members)
    - monat
    - jahr


    So..,
    als erstes setze ich einen Query auf members in dem ich userid und username abfrage und diese in jeweils einem array zwischenspeichere.
    als zweites setze ich einen Query auf statistik ab, in dem ich alle vorhandenen userids zum aktuellen monat abfrage und diese auch in einem array zwischenspeichere.
    im dritten schritt dann vergleiche ich die arrays und lasse mir nur jene Usernamen ausgeben, die zweiten userid-array nicht vorhanden sind.

    Das ganze ist irgendwie viel kürzer beschrieben als es codezeilen hat *lach* .. Wie dem auch sei, ist ein solcher Vergleich über 2 Tabellen mit Bedingungen auch in einem einzigen Query möglich sodass ich auf dieses array-gebastel verzichten kann?


    Ggf. falsches Sub, aber vll. gibt es auch eine php-variante das besser/anders zu lösen.


    Gruss & Danke

  • #2
    PHP-Code:
    SELECT 
      m
    .userid AS member
      s
    .userid AS stat_member
    FROM
      statistik s
    LEFT JOIN
      members m ON 
    (m.userid s.userid)
    WHERE
      s
    .monat irgendwas 
    wenn dann im array der index member leer ist, hat der keinen eintrag. geht bestimmt noch einfacher, aber in köln ist gerade karneval und ich kann mich nicht konzentrieren, wenn draussen die jecken toben.

    ist übrigens ein sql-problem, daher verschiebe ich es mal

    peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Da ist schonmal der erste Knoten bei mir geplatzt, hatte aus es auch mit JOINs versucht, aber von der falschen Seite/Richtung her. *g*

      Aaaaaber..., und jetzt kommts.. führe ich u.g. aus..
      PHP-Code:
      SELECT 
        m
      .UserId AS member
        
      m.UserName AS UserName
        
      s.nick AS stat_member
      FROM
        statistik s
      LEFT JOIN
        Members m ON 
      (m.UserId s.nick)
      WHERE
        s
      .monat 02
      AND 
        
      m.UserStatus >= 
      so bekomme ich ja nur ein Ergebniss (den UserNamen!) wenn ein Eintrag vorhanden ist. Aber ich brauche das genau andersrum, den UserNamen bekommen wenn KEIN Eintrag vorhanden ist. Nennt sich glaube ich 'rekursives Denken', was mir im Bezug auf MySQL nicht immer leicht fällt - und eben auch vor solch' ein Problem stellt.


      Offtopic: Siehste, drum halte ich mich von Köln (u.ä. Städten) während der 5. Jahreszeit fern. *g*

      Kommentar


      • #4
        draussen hämmern sie wie die verrückten auf ihren trommeln rum und ich denke mal wieder falsch herum. einfach den join umkehren:
        PHP-Code:
        SELECT 
          m
        .UserId AS member
          
        m.UserName AS UserName
          
        s.nick AS stat_member
        FROM
          Members m
        LEFT JOIN
          statistik s ON 
        (m.UserId s.nick)
        WHERE
          s
        .monat '02'
        AND 
          
        m.UserStatus >= 
        peter
        EDIT:
        wird auch nicht funktionieren wegen der bedingung. sch***s karneval. meld mich dienstag wieder
        Zuletzt geändert von Kropff; 22.02.2009, 18:23.
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          So gehts mir öfters - Nachbarn (oben und rechts) mit Baby.


          Wenn ich den JOIN drehe kommt immernoch in leeres Resultat raus obwohl kein Eintrag mit dem Monat '02' vorhanden ist - eigentlich müssten hier ja alle UserNamen rauskommen. *grübel*


          Edit: Dachte grade. *tröst* Nur kein Stress, dass ist nichts was ums verrecken Heute gelöst werden muss, eher ein optimierungtick den ich zur Zeit habe *g*

          Kommentar


          • #6
            letzter versuch, full outer join:
            PHP-Code:
            SELECT 
              m
            .UserId AS member
              
            m.UserName AS UserName
              
            s.nick AS stat_member
            FROM
              statistik s
            LEFT JOIN
              Members m ON 
            (m.UserId s.nick)
            WHERE
              s
            .monat '02'
            UNION
              SELECT
                m
            .UserId AS member
                
            m.UserName AS UserName
                
            s.nick AS stat_member
              FROM
                Members m
              RIGHT JOIN
                statistik s ON 
            (m.UserId s.nick)
              
            WHERE
                m
            .UserStatus >= 
            peter
            Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
            Meine Seite

            Kommentar


            • #7
              Müsste doch mit einem Subselect ganz gut gehen?

              SELECT * FROM members WHERE userid NOT IN (SELECT userid FROM statistik WHERE monat = '02')

              Kommentar


              • #8
                Original geschrieben von phpguru42
                Müsste doch mit einem Subselect ganz gut gehen?

                SELECT * FROM members WHERE userid NOT IN (SELECT userid FROM statistik WHERE monat = '02')
                du kommst aus keiner närrischen hochburg, oder? das ist es.

                peter
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar


                • #9
                  Stichwort Subselect.
                  Code:
                  SELECT m.* FROM members m WHERE m.userid NOT IN (
                      SELECT s.userid FROM statistik s WHERE monat = MONTH(CURDATE()) AND jahr = YEAR(CURDATE())
                  )
                  EDIT:
                  zu langsam

                  Kommentar


                  • #10
                    Hm, ne, Peter.

                    Damit kommen immer Usernamen, egal ob Eintrag vorhanden oder nicht.


                    @ phpguru42

                    Ja, ist eine funktionierende Möglichkeit, jedenfalls habe ich mit Deinem Beispiel grade etwas funktionierende Variante basteln können. Die Frage ist nun, was ist performanter?

                    PHP-Code:
                    SELECT 
                      UserName 
                    FROM 
                      Members 
                    WHERE 
                      UserStatus 
                    >= '3'
                    AND 
                      
                    UserId 
                    NOT IN
                      
                    (SELECT
                        nick
                      FROM 
                        statistik 
                      WHERE 
                        monat 
                    '02')
                    ORDER BY
                      UserName 

                    Kommentar


                    • #11
                      Performanter als? Du hast doch nur eine Lösung!?

                      Kommentar


                      • #12
                        Performanter als zb. das was ich im Eingangsposting beschrieb - aber das wird es denke ich mal sein. Das lehnte sich eher an das Beispiel von Kropff im Vergleich zum Subselect. Da sah ich die weiteren Postings noch nicht. *g*

                        Kommentar

                        Lädt...
                        X