Ich denke, das Problem ist, dass HAVING nach GROUP BY angewendet wird, aber immer noch vor der SELECT-Phase. Mir ist klar, dass es verwirrend ist, weil die HAVING-Klausel auf eine Spalte aus der SELECT-Anweisung verweist, aber ich denke, dass sie im Grunde nur zweimal ausführt, was in der SELECT-Anweisung steht – einmal für das Haben und dann noch einmal für das SELECT.
Siehe zB diese Antwort .
Beachten Sie, dass dies besonders verwirrend ist, da ein Verweis auf einen Spaltennamen, der nicht in der SELECT-Anweisung in einer HAVING-Klausel vorkommt, einen Fehler auslöst.
ZB diese Geige
Aber wie bei der obigen Geige können Sie immer noch basierend auf dem Ergebnis einer Funktion filtern, die nicht in der Ausgabe erscheint. Um es kurz zu machen, die HAVING-Klausel macht immer noch das, was Sie wollen, aber Sie können mit diesem Ansatz nicht nach einem zufälligen Wert filtern und ihn gleichzeitig anzeigen. Wenn Sie das tun müssen, müssen Sie zuerst eine Unterabfrage verwenden, um den Wert zu korrigieren, dann kann die äußere Abfrage ihn filtern und anzeigen.
Um es deutlich zu machen, lohnt es sich wahrscheinlich, nur RAND() in der Having-Klausel zu verwenden, nicht im SQL-Teil. Obwohl ich verstehe, dass diese Frage nach dem Warum fragt es tut dies, anstatt zu versuchen, das Problem speziell zu lösen.