UNION in IN() als Teil einer WHERE-Klausel?
bearbeitet von AugeHallo
> > Mit einem zusätzlichen Paar Klammern um den gesamten UNION-SELECT geht das auch (auch ohne Alias).
> >
> > ~~~sql
> > SELECT * FROM (
> > (SELECT id FROM entries WHERE spam = 0 ORDER BY time DESC LIMIT 6)
> > UNION
> > (SELECT id FROM entries WHERE spam = 0 ORDER BY edited DESC LIMIT 6)
> > )
> > ~~~
>
> Warum unter 5.7 Klammern um die ge-UNION-ten Selects nötig sind, ist mir nicht ganz einsichtig.
Um die `ORDER BY` und/oder `LIMIT`-Anweisungen der Einzelselects von denen des gesamten `UNION` zu unterscheiden, ist das für mich einsichtig. Ich wollte das ja auch so machen, um eine Vorfilterung, aus der ich eine schlusseinliche Auswahl treffe, vornehmen zu können.
Ziel war es, (angenommene) sechs Datensätze auszuwählen, die aus den neuen und/oder editierten Datensätzen stammen können. Mein Plan, hole die sechs neuesten frisch angelegten und die sechs neuesten editierten Datensätze und wähle aus dieser Menge von mindestens sechs bis maximal zwölf Datensätzen, zeitlich absteigend sortiert, die sechs neuesten Datensätze aus. Also brauche ich schon in den einzelnen Selects die Sortierung und das Limit, um dort nur noch die relevanten Einträge zu haben und dann noch einmal die gleichartige Sortierung-Limit-Kombi für das Gesamtergebnis. Um die beiden Fälle unterscheiden zu können, halte ich eine Klammerung durchaus für sinnvoll.
~~~sql
SELECT * FROM (
(SELECT id FROM entries WHERE spam = 0 ORDER BY time DESC LIMIT 6)
UNION
(SELECT id FROM entries WHERE spam = 0 ORDER BY edited DESC LIMIT 6)
) ORDER BY aus-time-und-edited-in-weiteren-im-Sternchen-verborgenen-Abfrageschritten-generierte-Spalte DESC LIMIT 6
~~~
Tschö, Auge
--
Wenn man ausreichende Vorsichtsmaßnahmen trifft, muss man keine Vorsichtsmaßnahmen mehr treffen.
Toller Dampf voraus von Terry Pratchett