gottlieb: GROUP BY und ORDER BY Zusammenspiel

Grüße,
ist es eigentlich in mySQL > 5.0.1x normal, dass mandavor nicht sortieren kann, bevor er gruppiert?

Ich habe in der Query ein count(A.Feld) und muss natürlich am Ende der Query nach A.Feld gruppieren. Er nimmt dann willkürlich einen Datensatz. Ich hätte gerne, dass er nach dem Feld Datum sortiert und die auf das aktuellste Datum gruppiert.

Sobald ich vor dem GROUP BY ein ORDER BY habe, erhalte ich die typische Fehlermeldung:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY ....

Winke

  1. Hello,

    ist es eigentlich in mySQL > 5.0.1x normal, dass mandavor nicht sortieren kann, bevor er gruppiert?

    ja, zumindest nicht auf der selben SELECT-Ebene. Aus deiner Problembeschreibung erahne ich, dass du sowas wie MAX suchst, aber ohne deine Datenstrukturen ist es schwer abzuschätzen. Beschreibe bitte deine Tabellen im Detail, welche Daten sich darin befinden und wie dein Ergebnis aussehen soll.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Wenn du die Nadel im Heuhaufen nicht findest, zünde den Heuhaufen an.
    1. Hay,

      ist es eigentlich in mySQL > 5.0.1x normal, dass mandavor nicht sortieren kann, bevor er gruppiert?
      ja, zumindest nicht auf der selben SELECT-Ebene. Aus deiner Problembeschreibung erahne ich, dass du sowas wie MAX suchst, aber ohne deine Datenstrukturen ist es schwer abzuschätzen. Beschreibe bitte deine Tabellen im Detail, welche Daten sich darin befinden und wie dein Ergebnis aussehen soll.

      Ich hole alle Verkaufsartikel (Table: Verkaufsartikel ) und LEFT JOIN'e dies mit Gebote (Table: Verkaufsgebote) und hole das Höchstgebot (bieterID) und wieviele Gebote (count(verkaufID) vorliegen. (Falls überhaupt Gebote vorliegen, ansonsten bleiben der rechte Teil des Datensatzes leer, da ja LEFT JOIN)

      Wenn mehrere Gebote nun vorliegen, habe ich mehrere Datensätze, deshalb gruppiere ich nach verkaufid.
      Jetzt erhalte ich alle Verkaufsartikel mit irgendeinem willkürlichen Gebot und nicht das Höchstgebot, da ich ja gruppiert habe. Ich hätte das ganze mit ORDER BY sortiert, ganz oben das Höchstgebot und dann sollte er es nach oben gruppieren.

      Hoffentlich war das verständlich. Ansonsten mache ich kurz eine kleine Tabellenstruktur und die Query.

      select a.verkaufid, a.verkaufstext, b.gebot, b.mitgliedsID, c.mitgliedsName, count(b.verkaufid) from Verkaufsartikel as a left join (Verkaufsgebote as b inner join User as c on b.bieterID=c.mitgliedID) on a.verkaufid=b.verkaufid where ..... group by b.verkaufid

      Etwas anderes Nebenbei. Anstatt Left Join habe ich mal mich einwenig in Sub-Selects eingelesen und habe folgende Fehlermeldung:
      Operand should contain 1 column(s)

      Kann man im Sub-Select nur ein Feld auslesen oder auch gleich mehere?

      Sprich:

      select a.feld1, a.feld2, (select b.feld3, b.feld4, c.feld5 from tabelle b INNER JOIN tabelle c where b.feld1=c.feld1) from tabelle a where a.field>0;
      Muss ich da noch nen Zusammenhang zwischen Sub-Select und tabelle a herschaffen?

      1. Zur Verdeutlichung. Nehmen wir an folgende Datensätze liegen als Ergebnis vor:

        ID TEXT   BIETER  GEBOT   COUNT
        2  abc    2222     5        1
        2  abc    3333     10       1
        2  abd    4444     4        1
        3  efg    3333     10       1

        Ich gruppiere hier nach ID, er sollte aber mit ORDER BY gebot gruppieren. (Falls überhaupt möglich)

        Also:

        ID TEXT   BIETER  GEBOT   COUNT
        2  abc    3333     10       3
        3  efg    3333     10       1

      2. Hay,

        Die Variante kannte ich noch nicht.

        Jetzt erhalte ich alle Verkaufsartikel mit irgendeinem willkürlichen Gebot und nicht das Höchstgebot, da ich ja gruppiert habe. Ich hätte das ganze mit ORDER BY sortiert, ganz oben das Höchstgebot und dann sollte er es nach oben gruppieren.

        Worauf du ja mehr oder weniger bereits hingewiesen wurdest.

        Was du brauchst, sind korrelierte/korrelierende Unterabfragen im Zusammenspiel mit Aggregatsfunktionen wie Max(Gebot).

        Etwas anderes Nebenbei. Anstatt Left Join habe ich mal mich einwenig in Sub-Selects eingelesen und habe folgende Fehlermeldung:
        Operand should contain 1 column(s)

        Kann man im Sub-Select nur ein Feld auslesen oder auch gleich mehere?

        So wie du es verwendest: Ja.
        Du kannst Sub-Queries aber auch
        a) hinter FROM oder
        b) in einer WHERE Klausel
        verwenden.

        select a.feld1, a.feld2, (select b.feld3, b.feld4, c.feld5 from tabelle b INNER JOIN tabelle c where b.feld1=c.feld1) from tabelle a where a.field>0;
        Muss ich da noch nen Zusammenhang zwischen Sub-Select und tabelle a herschaffen?

        Keine Ahnung, ob du musst. Aber so, wie du gerade denkst, geht es nicht. Warum JOINST du nicht einfach auch Tabelle B und C einfach zu A dazu

        SELECT A.feld1, A.feld2, B.feld3 .... <undsoweiter />
        FROM tabelleA A
        INNER JOIN tabelleB B ON ... <bedingung />...
        INNER JOIN tabelleB C ON ... <bedingung />...
        WHERE A.field > 0

        ??

        Ciao, Frank

        1. Hay,

          Die Variante kannte ich noch nicht.

          :-))

          Jetzt erhalte ich alle Verkaufsartikel mit irgendeinem willkürlichen Gebot und nicht das Höchstgebot, da ich ja gruppiert habe. Ich hätte das ganze mit ORDER BY sortiert, ganz oben das Höchstgebot und dann sollte er es nach oben gruppieren.

          Worauf du ja mehr oder weniger bereits hingewiesen wurdest.

          Was du brauchst, sind korrelierte/korrelierende Unterabfragen im Zusammenspiel mit Aggregatsfunktionen wie Max(Gebot).

          Ahja, oki, ich versuche da mal nach Beispiel zu googgeln, damit ich das verstehe. Werde ich schon irgendwie hinkriegen.

          Etwas anderes Nebenbei. Anstatt Left Join habe ich mal mich einwenig in Sub-Selects eingelesen und habe folgende Fehlermeldung:
          Operand should contain 1 column(s)

          Kann man im Sub-Select nur ein Feld auslesen oder auch gleich mehere?

          So wie du es verwendest: Ja.
          Du kannst Sub-Queries aber auch
          a) hinter FROM oder
          b) in einer WHERE Klausel
          verwenden.

          Oki doki danke. Da werde ich ein paar Versuche starten :-))

          select a.feld1, a.feld2, (select b.feld3, b.feld4, c.feld5 from tabelle b INNER JOIN tabelle c where b.feld1=c.feld1) from tabelle a where a.field>0;
          Muss ich da noch nen Zusammenhang zwischen Sub-Select und tabelle a herschaffen?

          Keine Ahnung, ob du musst. Aber so, wie du gerade denkst, geht es nicht. Warum JOINST du nicht einfach auch Tabelle B und C einfach zu A dazu

          SELECT A.feld1, A.feld2, B.feld3 .... <undsoweiter />
          FROM tabelleA A
          INNER JOIN tabelleB B ON ... <bedingung />...
          INNER JOIN tabelleB C ON ... <bedingung />...
          WHERE A.field > 0

          Damit wollte ich eigentlich nur das Problem mit dem Group by entgehen, war aber nichts, im zweiten Select müsste ich dann sowieso wieder gruppieren, wenn ich noch ein count von den Geboten haben will.
          Wenn ich alles in Tabelle A joine erhalte ich die Ausgabe wie im folgenden Link:

          http://forum.de.selfhtml.org/?t=167424&m=1091935

          Aber wie gesagt, den Tipp "korrelierte/korrelierende Unterabfragen im Zusammenspiel mit Aggregatsfunktionen wie Max(Gebot)." habe ich mir zu Herzen genommen :-)))

        2. Hi Frank, Deddlfix und Rouven,

          also, ich habe mich gestern einwenig korrelierte/korrelierende Unterabfragen und MAX eingelesen und folgende Query nun gebastelt:

            
          SELECT  
           A.verkaufid,  
           A.verkaufstext,  
           B.gebot,  
           B.mitgliedsID,  
           C.mitgliedsName,  
           count(B.verkaufid)  
            
           FROM Verkaufsartikel AS A LEFT JOIN  
           (Verkaufsgebote AS B INNER JOIN User AS C ON B.bieterID=C.mitgliedID)  
           ON A.verkaufid=B.verkaufid  
            
           WHERE A.datum>now()  
            
           AND  
            
           B.gebot=(SELECT MAX(B.gebot) FROM Verkaufsgebote AS A WHERE A.verkaufid=B.verkaufid) --- 1. Hole nur den Datensatz für das vorhande höchste Gebot. (Wo G.gebot=Am Maximalsten)  
            
           GROUP BY A.verkaufid --- 2. Ich kann nun Problemlos gruppieren, da ich den Datensatz mit dem höchsten Gebot habe  
            
           ORDER BY A.datum  --- 3. Und kann das ganze nun schön sortieren  
          
          

          Und nun mein Problem bei Punkt 1.
          Er holt nur die Datensätze, wo es auch ein B.gebot=Max gibt. Sobald aber keine Gebote vorliegen, sollte er die Datensätze dennoch holen, dann dann eben mit leeren Feldern Rechts.

          Grüße

          1. yo,

            nein, nein und nochmals nein. ;-)

            jedes vernünftige dbms gibt dir bei dieser abfrage eine fehlermeldnug aus. nur mysql meint, besonders schlau sein zu müssen, und spalten auszugeben, die nicht gruppiert wurden oder keine aggregat-funktion sind. mein tipp für dich, ganz schnell wieder vergessen. du brauchst die gruppierung in deinem konkreten fall sowieso nicht, einfach weglassen. und dann noch kurz den fall durchdenken, wenn das höchste gebot von mehreren abgeben wurde, falls das überhaupt sein kann nud den letzen INNER JOIN auf user würde ich ebenfalls als OUTER JOIN deklarieren.

            Ilja

            1. yo,

              yes

              nein, nein und nochmals nein. ;-)

              nein :-)

              jedes vernünftige dbms gibt dir bei dieser abfrage eine fehlermeldnug aus. nur mysql meint, besonders schlau sein zu müssen, und spalten auszugeben, die nicht gruppiert wurden oder keine aggregat-funktion sind. mein tipp für dich, ganz schnell wieder vergessen. du brauchst die gruppierung in deinem konkreten fall sowieso nicht, einfach weglassen.

              Ich habe in der Query ja ein count drin, deshalb muss ich ja gruppieren. Ansonsten erhalte ich eine Fehelrmeldung daas GROUP BY fehlt.

              und dann noch kurz den fall durchdenken, wenn das höchste gebot von mehreren abgeben wurde, falls das überhaupt sein kann nud den letzen INNER JOIN auf user würde ich ebenfalls als OUTER JOIN deklarieren.

              Das höchste Gebot von mehreren darf oder sollte nicht vorkommen. Falls ja, sollte das älteste Datum bevorzugt werden. (Aber wie gesagt, gleiche Gebote werden nicht zugelassen)

              Oki, werde OUTER JOIN machen.
              Aber eine Frage (Problem 1.) bleibt noch offen.

              Er holt nur die Datensätze, wo es auch ein B.gebot=Max gibt. Sobald aber keine Gebote vorliegen, sollte er die Datensätze dennoch holen, dann dann eben mit leeren Feldern Rechts.

              1. yo,

                Ich habe in der Query ja ein count drin, deshalb muss ich ja gruppieren. Ansonsten erhalte ich eine Fehelrmeldung daas GROUP BY fehlt.

                das count baust du wiederum in eine unterabfrage ein, dann kannst du dir das GROUP BY sparen.

                Aber eine Frage (Problem 1.) bleibt noch offen.

                hier liegt vermutlich deni fehler: B.gebot=(SELECT MAX(B.gebot)

                ich würde MAX(A.gebot) nehmen

                Ilja

                1. yo,

                  :-)

                  Ich habe in der Query ja ein count drin, deshalb muss ich ja gruppieren. Ansonsten erhalte ich eine Fehelrmeldung daas GROUP BY fehlt.

                  das count baust du wiederum in eine unterabfrage ein, dann kannst du dir das GROUP BY sparen.

                  Oki ich werde mal gleich eine Query basteln, für den Count eine Unterabfrage.

                  Aber eine Frage (Problem 1.) bleibt noch offen.

                  hier liegt vermutlich deni fehler: B.gebot=(SELECT MAX(B.gebot)

                  ich würde MAX(A.gebot) nehmen

                  Ein A.Gebot hab ich leider nicht. Alle Gebote liegen in der Tabelle "Verkaufsgebote" Ich könnte das Höchstgebot aber eigentlich in eine neue Spalte in der Tabelle "Verkaufsartikel" zwischenspeichern. Das wollte ich mir eigentlich ersparen.

                  B.gebot=(SELECT MAX(B.gebot) klappt ja auch gut, wenn ein Gebot vorliegt. Wenn nicht, dann bleibt der ganze Artikel weg, falls kein Gebot vorliegt.

                  1. yo,

                    Ein A.Gebot hab ich leider nicht. Alle Gebote liegen in der Tabelle "Verkaufsgebote"

                    du benutzt die tabelle aber zweimal und einmal in der unterabfrage mit dem alias-namen A, ergo gibt es auch ein a.Gebot

                    B.gebot=(SELECT MAX(B.gebot) klappt ja auch gut, wenn ein Gebot vorliegt. Wenn nicht, dann bleibt der ganze Artikel weg, falls kein Gebot vorliegt.

                    das liegt daran, dass du natürlich auch NULL werte aus der Unterabfrage zurück bekommst, wenn noch gar kein gebot vorliegt. nun gibt es verschiedene wege, das zu lösen. entwerder zwei abfragen mit UNION ALL verbinden oder aber in der WHERE klausel noch ein OR einfügen, dass nach NULL prüft.

                    WHERE A.datum>now()
                    AND (B.gebot = (SELECT MAX(A.gebot)  <----- hier das A.Gebot
                                    FROM Verkaufsgebote A
                                    WHERE A.verkaufid=B.verkaufid
                                   )
                         OR
                         NOT EXISTS (SELECT NULL
                                     FROM Verkaufsgebote A
                                     WHERE A.verkaufid=B.verkaufid
                                    )
                         )

                    Ilja

                    1. yo,

                      noch eleganter, aber eventuell schwieriger zu lesen ist, wenn du den NULL Wert direkt mit einer Funktion abfängt (bei mysql bin ich mir nicht sicher, eventuell heisst sie ISNULL).

                      WHERE A.datum>now()
                      AND (B.gebot = (SELECT ISNULL(MAX(A.gebot), b.Gebot)  <----- hier das A.Gebot
                                      FROM Verkaufsgebote A
                                      WHERE A.verkaufid=B.verkaufid
                                     )

                      Ilja

                      1. soo,

                        noch eleganter, aber eventuell schwieriger zu lesen ist, wenn du den NULL Wert direkt mit einer Funktion abfängt (bei mysql bin ich mir nicht sicher, eventuell heisst sie ISNULL).

                        WHERE A.datum>now()
                        AND (B.gebot = (SELECT ISNULL(MAX(A.gebot), b.Gebot)  <----- hier das A.Gebot
                                        FROM Verkaufsgebote A
                                        WHERE A.verkaufid=B.verkaufid
                                       )

                        Ja, hier ist aber die Query wesentlich kürzer und kompakter ;) Select Isnull heißt, dass er selektiert, und sobald nichts vorhanden ist, er dies mit einer Null oder 0 versieht?? Habe ich richtig getippt?

                        Dann wäre die Bedingung:

                        WHERE A.datum>now() AND B.gebot=0

                        Grüße

                        1. yo,

                          nein, zum einen ist NULL <> 0 und zum anderen bedeutet ISNULL: gebe den wert aus, den du hast, es sei den, du hast einen NULL wert, dann ersetze diesen mit einem anderen wert, in deinem falle mit gebot. deine aliasnamen der tabellen A und B sind zimelich durcheinander gewürfelt, aber es sollte das gebot aus der oberen abfrage sein.

                          der fehler, warum du mit IS NULL keine datensätze bekommst ist wahrscheinlich, weil ich es an die falsche stelle getan habe. versuch mal das ISNULL ausherum um die unterfrageb zu machen also:

                          AND b.gebot = ISNULL((hier_unterabfrage), b.gebot)

                          Ilja

                          1. :-)

                            nein, zum einen ist NULL <> 0 und zum anderen bedeutet ISNULL: gebe den wert aus, den du hast, es sei den, du hast einen NULL wert, dann ersetze diesen mit einem anderen wert, in deinem falle mit gebot. deine aliasnamen der tabellen A und B sind zimelich durcheinander gewürfelt, aber es sollte das gebot aus der oberen abfrage sein.

                            Danke für die ausführliche Erklärung. Sowas wäre dann auch möglich:
                            Gebe den Wert aus, den du hast, es sei den, du hast einen NULL wert, dann fülle die Felder mit Null.

                            Die Tabellen sehen in etwa so aus:

                            Verkaufstabelle:
                            verkaufid verkaufstext

                            Verkaufgebote:
                            verkaufsid gebot bieterID (Gebot ist das abgegegebene Gebot und Bieterid, der, der das Gebot abgegeben hat) D.h., dann würde das folgende ja nicht gehen:

                            AND b.gebot = ISNULL((hier_unterabfrage), b.gebot)

                            Gebe den Wert aus >>hier_unterabfrage (Select max b.gebot)<< den du hast, es sei denn, du hast einen Null wert (ja wir haben einen Null Wert, da kein Gebot vorhanden), dann fülle die Felder mit b.gebot (b.Gebot ist ja auch nicht da, da kein Gebot vorliegt)

                            Deshalb ging das nicht. Wie gesagt mit OR NOT EXISTS tut das ganze aber korrekt.

                            gruß

                      2. söu,

                        Also, die Qeury mit "ISNULL" führt zu keinem Ergebnis. Die Query mit "OR NOT EXISTS" führt zu dem Ergebnis, so wie ich es haben will.
                        Nur der count funktioniert nicht, da er ja gruppiert.

                        das count baust du wiederum in eine unterabfrage ein, dann kannst du dir das GROUP BY sparen.

                        Wärst du so lieb, und könntest mir das an der vorhandenen Query zeigen. Wenn es dir nichts ausmacht.

                        1. yo,

                          Also, die Qeury mit "ISNULL" führt zu keinem Ergebnis. Die Query mit "OR NOT EXISTS" führt zu dem Ergebnis, so wie ich es haben will.
                          Nur der count funktioniert nicht, da er ja gruppiert.

                          poste hier mal beide abfragen, damit ich sie mir anschauen kann.

                          Ilja

                          1. ich habe jetzt den count in eine unterabfrage reingepackt:

                              
                            SELECT  
                             A.verkaufid,  
                             A.verkaufstext,  
                             B.gebot,  
                             B.bieterID,  
                             C.mitgliedsName,  
                             (SELECT count(*) FROM Verkaufsgebote AS B WHERE A.verkaufid=B.verkaufid)  
                              
                             FROM Verkaufsartikel AS A LEFT JOIN  
                             (Verkaufsgebote AS B INNER JOIN User AS C ON B.bieterID=C.mitgliedID)  
                             ON A.verkaufid=B.verkaufid  
                              
                             WHERE A.datum>now()  
                              
                             AND  
                              
                             (  
                              B.gebot=(SELECT MAX(B.gebot) FROM Verkaufsgebote AS A WHERE A.verkaufid=B.verkaufid)  
                              
                              OR NOT EXISTS  
                              
                              (SELECT NULL FROM Verkaufsgebote AS B WHERE A.verkaufid=B.verkaufid)  
                             )  
                              
                              
                             ORDER BY A.datum  
                            
                            

                            Und das ganze funktioniert, sieht nur einwneig heftig aus die Query finde ich. Ich habe nun 4 SELECTS und habe 3 Tabellen miteinander verbunden.

                            Wäre ich da nicht besser dran von der Perfomance her betrachtet, wenn ich zwei getrennte Querys mache??
                            Was ich noch prüfen könnte, ob der Mitgliedstatus C.status auf 1 gesetzt ist. Sprich, das Mitglied noch registriert. Dann wird die Query noch größer, dies müsste ich dann beim count in der Unterabfrage machen und bei Select Max.

                            1. yo,

                              jetzt ist mir auch klar, was da mit den alias namen schief läuft. tip, niemals, aber auch nie den gleichen aliasnamen in einer abfrage zwei tabellen zu geben. du amchst das gleich merfach, dasss du tabellen in den unterrabfragen den gleichen aliasnamen gibts wie in der äußeren abfrage. ich sag mal pfui ;-)

                              ersetze mal folgendes:

                              AND

                              (
                                B.gebot=(SELECT MAX(B.gebot) FROM Verkaufsgebote AS A WHERE A.verkaufid=B.verkaufid)

                              OR NOT EXISTS

                              (SELECT NULL FROM Verkaufsgebote AS B WHERE A.verkaufid=B.verkaufid)
                               )

                              durch dieses hier:

                              AND B.gebot= IFNULL((SELECT MAX(B2.gebot) FROM Verkaufsgebote B2 WHERE A2.verkaufid=B.verkaufid), B.gebot)

                              Ilja

                              1. So,

                                jetzt ist mir auch klar, was da mit den alias namen schief läuft. tip, niemals, aber auch nie den gleichen aliasnamen in einer abfrage zwei tabellen zu geben. du amchst das gleich merfach, dasss du tabellen in den unterrabfragen den gleichen aliasnamen gibts wie in der äußeren abfrage. ich sag mal pfui ;-)

                                :-)

                                ersetze mal folgendes:

                                AND

                                (
                                  B.gebot=(SELECT MAX(B.gebot) FROM Verkaufsgebote AS A WHERE A.verkaufid=B.verkaufid)

                                OR NOT EXISTS

                                (SELECT NULL FROM Verkaufsgebote AS B WHERE A.verkaufid=B.verkaufid)
                                )

                                durch dieses hier:

                                AND B.gebot= IFNULL((SELECT MAX(B2.gebot) FROM Verkaufsgebote B2 WHERE A2.verkaufid=B.verkaufid), B.gebot)

                                Das bringt 0 Resultate. Die vorherige Query bringt korrekterweise 3 Resultate.
                                Ich checke auch ehrlich gesagt nicht, wie:

                                B.gebot= IFNULL((SELECT MAX(B2.gebot) FROM Verkaufsgebote B2 WHERE A2.verkaufid=B.verkaufid), B.gebot)

                                funktionieren soll?
                                Gebe den Wert aus >>hier_unterabfrage (Select max b.gebot)<< den du hast, es sei denn, du hast einen Null wert (ja wir haben einen Null Wert, da kein Gebot vorhanden), dann fülle die Felder mit b.gebot (b.Gebot ist ja auch nicht da, da kein Gebot vorliegt)

                                1. yo,

                                  Ich checke auch ehrlich gesagt nicht, wie:

                                  B.gebot= IFNULL((SELECT MAX(B2.gebot) FROM Verkaufsgebote B2 WHERE A2.verkaufid=B.verkaufid), B.gebot)

                                  funktionieren soll?

                                  tut es auch nicht, zum einen habe ich mich mit A2.verkaufid verschrieben, es muss natürlich B2.verkaufsid sein und zum anderen hast du recht, NULL wird nicht mit gleichheit (=) geprüft und insofern muss es fehl schlagen. das habe ich in meinen eifer nicht bedacht. NULL = NULL wird immer falls ergeben, es muss mit IS NULL geprüft werden und dafür brauchst du dann auch keine unterabfrage, da wir ja sowieso vorher einen LEFT JOIN auf die gebote machen. da hatte ich doch einen dicken knoten im kopf. das OR muss sein, du kannst es aber ohne unterabfrage mit "OR b.gebot IS NULL" prüfen.

                                  eine andere option ist die verwendung vpn UNION ALL, also zwei abfragen, die mit dem mengenoperator verbunden werde.

                                  Ilja

                    2. Soo,

                      Ein A.Gebot hab ich leider nicht. Alle Gebote liegen in der Tabelle "Verkaufsgebote"

                      du benutzt die tabelle aber zweimal und einmal in der unterabfrage mit dem alias-namen A, ergo gibt es auch ein a.Gebot

                      Oh, das ist natürlich ein Fehler von mir gewesen. In der zweiten Abfrage muss es natürlich auch AS B heißen, anstatt "FROM Verkaufsgebote AS A".

                      das liegt daran, dass du natürlich auch NULL werte aus der Unterabfrage zurück bekommst, wenn noch gar kein gebot vorliegt. nun gibt es verschiedene wege, das zu lösen. entwerder zwei abfragen mit UNION ALL verbinden oder aber in der WHERE klausel noch ein OR einfügen, dass nach NULL prüft.

                      Gut, Union All kenne ich nicht, werde mich aber gleich dadrüber schlau machen.

                      WHERE A.datum>now()
                      AND (B.gebot = (SELECT MAX(A.gebot)  <----- hier das A.Gebot
                                      FROM Verkaufsgebote A
                                      WHERE A.verkaufid=B.verkaufid
                                     )
                           OR
                           NOT EXISTS (SELECT NULL
                                       FROM Verkaufsgebote A
                                       WHERE A.verkaufid=B.verkaufid
                                      )
                           )

                      Ich probiere mal diese Variante gleich aus.

                      "NOT EXISTS (SELECT NULL".. Nach Null prüfen heißt, er schaut, ob es in "FROM Verkaufsgebote A  WHERE A.verkaufid=B.verkaufid" überhaupt was gibt. Falls nein, ist die Where-Bedinung mit NOT EXISTS auch erfüllt.

  2. echo $begrüßung;

    ist es eigentlich in mySQL > 5.0.1x normal, dass mandavor nicht sortieren kann, bevor er gruppiert?

    Die Reihenfolge der Klauseln eines SQL-Statements ist festgelegt und entspricht recht genau der internen Abarbeitung. Eine Sortierung kann erst dann erfolgen wenn die Ergebnismenge feststeht.

    Ich habe in der Query ein count(A.Feld) und muss natürlich am Ende der Query nach A.Feld gruppieren. Er nimmt dann willkürlich einen Datensatz. Ich hätte gerne, dass er nach dem Feld Datum sortiert und die auf das aktuellste Datum gruppiert.

    Erläutere bitte die letzten beiden Sätze. Willst du damit sagen, dass du in der Feldliste andere Spalten stehen hast, als die nach denen gruppiert wird zuzüglich der Aggregatfunktionsspalten? In dem Fall ist es eine Besonderheit MySQLs, dir diese Spalten nicht um die Ohren zu hauen, so wie es andere DBMS tun. Stattdessen bekommst du da Werte irgendeines zufälligen Datensatzes geliefert.

    echo "$verabschiedung $name";