group by und min

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

  • group by und min

    Hi,
    ich habe in einer tabelle mehrere zeilen mit der gleichen user_id. jetzt möchte ich von denen die zeile mit dem kleinsten pos wert.

    also z.b hab ich vier zeilen bei denen user_id gleich ist. bei einer zeile is pos 9 bei den anderen drei ist pos 11. jetzt möchte ich die zeile mit pos 9.

    probiert hab ich schon
    PHP-Code:
    SELECT *,min(posFROM pics GROUP BY user_id HAVING min(pos
    liefert, aber nicht das gewünsche ergebnis

    gruss
    jakob

  • #2
    Re: group by und min

    Geht nicht ... zumindest nicht in einem Query. Du kannst vor einem Group By nicht sortieren, leider >.>
    Ersatz-Query will mir gerade nicht einfallen, mein Hirn ist gerade Matsche

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      So, nu ist endgültig fratze x_X
      Code:
      SELECT a.*
      FROM `pics` a
      WHERE a.id IN (
         SELECT b.id FROM pics b
         WHERE b.user_id = a.user_id
         ORDER BY pos ASC
      )
      GROUP BY a.user_id
      [edit]
      Full-Select .. hübsch Oo,
      Zuletzt geändert von ghostgambler; 15.11.2006, 19:30.

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        öhm gleiches ergebnis wie bei SELECT * FROM pics GROUP BY user_id

        [edit]

        mit
        PHP-Code:
        SELECT a . *
        FROM `picsa
        WHERE pos
        IN 
        (

        SELECT minpos )
        FROM pics b
        GROUP BY b
        .user_id
        )
        GROUP BY a.user_id 
        bekomm ich zumindest schonmal das richtige ergebnis. der wert von pos ist einmalig hätte ich vielleicht noch sagen sollen. aber der query ist bestimmt ziemlich performance lastig, oder? geht das nicht irgendwie schneller?
        Zuletzt geändert von TimeRaider; 15.11.2006, 19:47.

        Kommentar


        • #5
          Original geschrieben von TimeRaider
          öhm gleiches ergebnis wie bei SELECT * FROM pics GROUP BY user_id
          Gibt bei mir das richtige Ergebnis

          Test-Dump(Struktur+Daten) mit gewünschtem Ergebnis-Tuple, danke

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar


          • #6
            bei mir nicht hab gerade den oberen beitrag editiert

            Kommentar


            • #7
              Ja, bei mir waren die Daten sortiert, deshalb gab es zufällig das korrekte Result-Tuple ~.~

              Original geschrieben von TimeRaider
              aber der query ist bestimmt ziemlich performance lastig, oder? geht das nicht irgendwie schneller?
              Hätte spontan nen ganz dummen Einfall, eine zusätzliche Spalte, die angibt ob die aktuelle Zeile die mit dem kleinsten Wert ist

              könnte man ev. mit dem Trigger aktuell halten, wenn du keine Lust hast das von Hand zu machen
              Code:
              DELIMITER |
              CREATE TRIGGER pic_min_insert AFTER INSERT ON pics
              FOR EACH ROW BEGIN
                 UPDATE pics SET minimal = 0 WHERE user_id = NEW.user_id;
                 UPDATE pics SET minimal = 1 WHERE user_id = NEW.user_id ORDER BY pos ASC LIMIT 1;
              END|
              DELIMITER ;
              weil performant ist der Query mit Sicherheit nicht, da dürfte die Lösung über den Trigger besser sein .. geht allerdings erst ab mysql5

              Und dann würde ein Query allá
              SELECT * FROM pics WHERE minimal = 1;
              das gewünschte Ergebnis bringen

              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
              Wie man Fragen richtig stellt

              Kommentar


              • #8
                Hey,

                ok danke.

                muss ich den trigger dann einfach am anfang vom script mit mysql_query ausführen?

                gruss
                jakob

                Kommentar


                • #9
                  Original geschrieben von TimeRaider
                  muss ich den trigger dann einfach am anfang vom script mit mysql_query ausführen?
                  Ne, der ist für immer in der DB ... man lese das Manual bezüglich Triggern

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    hm ich glaub mit triggern funktioniert das nicht.

                    ich erklär einfach mal was ich genau mach:
                    es gibt noch zwei andere spalten "in" und "out" aus denen wird dann einmal am tag ein prozentwert gebildet und die zeile in der dieser am größten ist bekommt pos 1, die mit dem zweit größten prozentwert 2 und immer so weiter. kann ich da gleich das minimal mit einbaun oder wie mach ich das am besten?

                    Kommentar


                    • #11
                      Original geschrieben von TimeRaider
                      hm ich glaub mit triggern funktioniert das nicht.

                      ich erklär einfach mal was ich genau mach:
                      es gibt noch zwei andere spalten "in" und "out" aus denen wird dann einmal am tag ein prozentwert gebildet und die zeile in der dieser am größten ist bekommt pos 1, die mit dem zweit größten prozentwert 2 und immer so weiter. kann ich da gleich das minimal mit einbaun oder wie mach ich das am besten?
                      WIESO machst du eigentlich nicht einfach ein
                      WHERE pos = 1 ?????????? -.-

                      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                      Wie man Fragen richtig stellt

                      Kommentar


                      • #12
                        weil es verschiedene user_id gibt und die dann in einer liste ausgegeben werden, aber natürlich nur die mit dem kleinsten pos wert?
                        PHP-Code:
                        mysqlSELECT id,user_id,pos FROM pics ORDER by user_id;
                        +----+---------+-----+
                        id user_id pos |
                        +----+---------+-----+
                        27 |       |   |
                        32 |       |  12 |
                        24 |       |   |
                        25 |       |  10 |
                        31 |       |   |
                        19 |       |   |
                        17 |       |  11 |
                        |  
                        |       |   |
                        21 |       |   |
                        33 |       |  13 |
                        10 |       |   |
                        22 |      10 |   |
                        23 |      10 |   |
                        +----+---------+-----+ 
                        und von der tabelle will ich jetzt die zeilen mit der id 31,19,10,22 was ja auch mit
                        PHP-Code:
                            SELECT a . *
                            
                        FROM `picsa
                            WHERE pos
                            IN 
                        (

                            
                        SELECT minpos )
                            
                        FROM pics b
                            GROUP BY b
                        .user_id
                            
                        )
                            
                        GROUP BY a.user_id 
                        ganz gut funktioniert und jetzt möchte ich halt nur noch wie du vorgeschlagen hast eine spalte minimal und weiß nicht wie ich das am besten machen, weil das sollte ja von der geschwindigkeit her auch passen.

                        Kommentar


                        • #13
                          Achso ... user-übergreifende pos ~.~

                          Wie sieht denn das Skript aus, welches die pos-Spalte berechnet?

                          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                          Wie man Fragen richtig stellt

                          Kommentar


                          • #14
                            ist eigentlich ziemlich einfach
                            PHP-Code:
                                $result $sql->query("SELECT id,`in`,out,((`in`/(`in`+out))*100) as prozent FROM pics ORDER by prozent DESC");
                                
                                
                            $i 1;
                                
                                while (
                            $row $sql->fetch_assoc($result)) {
                                    
                            $sql->query("UPDATE pics SET pos=".$i." WHERE id=".$row['id']);
                                    
                            $i++;
                                } 

                            Kommentar


                            • #15
                              Okay, also ... du kannst eine User-Variable in MySQL verwenden, welche dir in deinem Ergebnis automatisch die pos Zählt

                              Code:
                              SET @pos = 0;
                              UPDATE pics SET pos = @pos = @pos+1 ORDER BY (in/(in+out));
                              Das sollte genau das machen wie dein Query oben (ich hoffe die Syntax ist jetzt richtig oO), nur halt in einem Query und ohne While ... vllt. kann man da mit einer weiteren Var und einem IF direkt im Query die min-Spalte setzen, hab aber keine Zeit mehr das jetzt auszuprobieren (weil Schule ^^)

                              Kannst ja mal selbst rumprobieren *wink*

                              Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                              bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                              Wie man Fragen richtig stellt

                              Kommentar

                              Lädt...
                              X