Announcement

Collapse
No announcement yet.

Subquery in MySQL 3.23.58

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Subquery in MySQL 3.23.58

    Hallo,
    folgendes Problem:

    Ich mach ein Programm das in einer Tabelle alle Eingänge mengenmäßig speichert (liste).
    Was und von wem eingegangen ist, ist per SPENDER_ID und ITEM_ID dort mit vermerkt.
    Bei der Übersicht über die fleissigsten Spender steh ich nun vor einem Rätsel. Ich möchte drei fleissigsten Spender für jedes Item auflisten, das sah zuerst so aus:

    SELECT *, sum(MENGE) FROM liste WHERE ITEM_ID=1 GROUP BY SPENDER_ID ORDER BY sum(MENGE) ASC, ID LIMIT 3;
    und da bekomm ich ERROR #1111 - Invalid use of group function.
    Wenn ich das ORDER BY weglasse, funzt es aber schonmal

    Dann wollte ichs über ein Subquery sortieren, aber ich bekomm da wo die Klammer aufgeht einen Parse_Error (siehe unten)

    Was mich vermuten lässt, dass es vielleicht mit meiner SQL-Version zusammenhängt, da in der Online-Doc immer ab Version 4+ die Rede ist. Kann das jemand bestätigen?
    Gibt es noch eine andere Möglichkeit, wie ich das lösen kann, ohne das Ganze dann noch in PHP sortieren zu müssen?

    Danke !

    SELECT *
    FROM (
    SELECT * , sum( MENGE )
    FROM liste
    WHERE ITEM_ID =3
    GROUP BY SPENDER_ID
    LIMIT 3 )
    ORDER BY sum( MENGE )

    SELECT *
    FROM ABC
    WHERE ABC = (
    SELECT * , sum( MENGE )
    FROM liste
    WHERE ITEM_ID =3
    GROUP BY SPENDER_ID
    LIMIT 3 )
    ORDER BY sum( MENGE )

    MySQL meldet:

    #1064 - You have an error in your SQL syntax near 'SELECT * , sum( MENGE )
    FROM liste
    WHERE ITEM_ID =3
    GROUP BY SPENDER_ID
    LIMIT' at line 4

  • #2
    Hallo Ben,

    damit ein GROUP BY sauber funktioniert, müssen alle nicht aggregierten Felder der SELECT Liste auch im GROUP BY auftauchen. Also
    SELECT SPENDER_ID, sum(MENGE) FROM liste
    WHERE ITEM_ID=1
    GROUP BY SPENDER_ID,
    ORDER BY sum(MENGE) ASC LIMIT 3;

    Gruß Fal
    Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

    Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

    Comment


    • #3
      Moin Falk,

      danke für die Antwort, aber dreierlei:

      1. Deine Zeile verursacht bei mir folgenden Fehler: #1064 - You have an error in your SQL syntax near 'ORDER BY sum( MENGE ) ASC
      LIMIT 3 ' at line 5

      2. nehm ich das komma hinter Group by Spender_ID weg (was mir dort falsch vorkommt, oder ists da doch richtig?) , gibt er mir wieder Fehler #1111 aus (invalid use of group function)

      3. wenn ich nun aber alle Felder aus der Tabelle brauche, muss ich die dann alle hinter Select, und dann AUCH hinter Group by angeben??

      Auf dieser Seite:
      http://www.torsten-horn.de/techdocs/sql.htm seh ich in der obersten Tabelle, dass MySQL 3.23 keine Subselects (was wohl Subqueries sind) unterstützt.
      Damit bin ich wohl auf Group By angewiesen :

      Comment


      • #4
        Hallo Ben,

        1.+2.: Das Komma hinter Spender_ID ist natürlich - wie du richtig vermutest - quatsch. MySQL mag offensichtlich das SUM() im ORDER BY nicht. Aber eine Sortierung nach Spaltenpostition müßte funktionieren. Also: <b>ORDER BY 2</b>
        .
        3: MySQL ist da wohl weniger kritisch als z.B. Oracle - einfach mal probieren und sehen ob die Ergebnisse die gewünschten sind. Ich könnte das Ergebnis eines SELECT feld1, feld2, sum(feld3) FROM tabelle GROUP BY feld4 jedenfalls nicht vorhersagen
        .
        Bis einschließlich Version 4.0 (darüber bin ich mir nicht sicher) werden von MySQL Sub-Selects nur in der Form INSERT ... SELECT ... und REPLACE ... SELECT unterstützt.
        Da auch die Unterstützung für Views fehlt ist es oftmals relativ schwierig komplexe Abfragen (gerade mit Aggregatfunktionen) in einem "Rutsch" zu schreiben. Oftmals kommt man dann um die Nachbehandlung von Rohdaten in der Applikation nicht umhin, oder man muß temporäre Tabellen verwenden, um Zwischenergebnisse abzulegen.

        Gruß Fal
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Hy Falk,

          also bei ORDER BY 2 habe ich auch wieder #1111 ...
          das heisst für mich: wenn er nich will, will ichs auch nicht mehr .

          Und wenn Du sagst, dass es weder Schande noch Sünde ist, die Daten auch mal im Programm weiterzuverwursten, dann werde ich es eben so machen... muss nur mal wieder meine Sortierfunktion für mehrdimensionale assoziative Arrays rauskramen.

          Dann danke für die Hilfe :

          Comment

          Working...
          X