Wie zu verwenden UM VON innen UNION
Möchte ich verwenden, UM auf jedem UNION ALL Abfragen, aber ich kann nicht herausfinden, die richtige syntax. Dies ist, was ich will:
(
SELECT id, user_id, other_id, name
FROM tablename
WHERE user_id = 123 AND user_in IN (...)
ORDER BY name
)
UNION ALL
(
SELECT id, user_id, other_id, name
FROM tablename
WHERE user_id = 456 AND user_id NOT IN (...)
ORDER BY name
)
BEARBEITEN:
Nur um klar zu sein: ich brauche zwei geordnete Listen wie diese, nicht:
1
2
3
1
2
3
4
5
Vielen Dank!
Die ORDER BY-Klauseln in der Abfrage (innerhalb der Klammern) werden nicht berücksichtigt (laut MySQL-Referenz-Handbuch.) MySQL ist frei, um zurückzukehren, die Zeilen in beliebiger Reihenfolge, da es keine
ORDER BY
auf die Abfrage. (Für die Anweisung angezeigt, in die Frage, ein ORDER BY
Klausel wäre erforderlich, am Ende der Anweisung, nach diesem letzten schließenden Klammer. Um die zurückgegebenen Zeilen in der angegebenen Reihenfolge, eine Möglichkeit ist, um ein "Diskriminator" - Spalte (d.h. eine ausgeprägte Literale zurückgegeben, die in jeder Abfrage, und fügen Sie dann die Spalte in der ORDER BY
- Klausel.InformationsquelleAutor VORiAND | 2014-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollte sowas funktioniert in MySQL:
Beachten Sie jedoch, fehlt eine
ORDER BY
(oderGROUP BY
) - Klausel auf die äußerste Abfrage die Reihenfolge, in der die Zeilen zurückgegeben werden, ist NICHT garantiert.Wenn Sie müssen die zurückgegebenen Zeilen in einer bestimmten Reihenfolge sollten Sie auch ein
ORDER BY
auf der äußersten Abfrage. In vielen Anwendungsfällen, die wir können, verwenden Sie einfach einenORDER BY
auf der äußersten Abfrage zu erfüllen, die Ergebnisse.Allerdings, wenn Sie haben einen Anwendungsfall, in dem Sie müssen alle Zeilen aus der ersten Abfrage zurückgegeben werden, bevor alle Zeilen aus der zweiten Abfrage, eine option ist auch ein zusätzlicher Diskriminator-Spalte in jeder der Abfragen. Zum Beispiel, fügen Sie
,'a' AS src
in der ersten Abfrage,,'b' AS src
der zweiten Abfrage.Dann die äußerste Abfrage einschließen könnte
ORDER BY src, name
, garantieren die Reihenfolge der Ergebnisse.FOLLOWUP
In Ihre ursprüngliche Abfrage, die
ORDER BY
in Ihren Abfragen verworfen wird durch den optimizer; da es keineORDER BY
angewandt, um die äußere Abfrage, MySQL ist frei, um zurückzukehren, die Zeilen in der Reihenfolge, es will.Den "trick" in der Abfrage in meiner Antwort (oben) ist abhängig von Verhalten, die möglicherweise spezifisch für einige Versionen von MySQL.
Test-Fall:
Auffüllen, Tabellen
Abfrage
resultset zurückgegeben
Zeilen aus
foo2
zurückgegeben "in Ordnung", gefolgt von den Zeilen ausfoo3
wieder "in Ordnung".Hinweis (mal wieder), dass dieses Verhalten NICHT garantiert. (Das Verhalten, das wir Beobachter ist eine Nebenwirkung, wie MySQL-Prozesse inline-views (abgeleitete Tabellen). Dieses Verhalten kann in Versionen nach 5.5.)
Wenn Sie müssen die zurückgegebenen Zeilen in einer bestimmten Reihenfolge, dann geben Sie eine
ORDER BY
Klausel für Regionen in äußerster Randlage Abfrage. Und, dass die Bestellung gilt für die gesamte resultset.Wie ich bereits erwähnt, wenn ich brauchte die Zeilen aus der ersten Abfrage, gefolgt von der zweiten Abfrage, ich würde ein "Diskriminator" - Spalte, die in jeder Abfrage, und fügen Sie dann die "discriminator" - Spalte in der ORDER BY-Klausel. Würde ich auch tun, Weg mit dem inline-Ansichten, und etwas wie das hier tun:
edit.: Die syntax ist richtig, aber es gibt UM nicht zu arbeiten. Die Liste ist nicht geordnet 🙁
InformationsquelleAutor spencer7593
Du einfach ein ORDER BY am Ende.
Die Union stellt zwei auswählt, die in einem logischen wählen. Die order-by-gilt für das gesamte set, nicht zu jedem Teil.
Verwenden Sie keine Klammern. Nur:
dann müssen Sie Informationen hinzufügen, die den Ursprung der Reihe, wie:
select ..., 1 as origin from foo where ... union all select ..., 2 as origin from bar where ... order by origin, ...
Können Sie bitte einige Beispiele in Ihrer Antwort?
Ich habe aktualisiert das Beispiel hier mit Lennart ' s Vorschlag deutlich zu machen.
ist deine Frage damit beantwortet? Ist es klar?
InformationsquelleAutor pmbAustin
Nicht verwenden
ORDER BY
im individuellenSELECT
- Anweisung innerhalb einerUNION
, es sei denn, du bist mitLIMIT
.Den Die MySQL-docs auf UNION erklären, warum (Hervorhebung von mir):
Wie es scheint, eine
ORDER BY
- Klausel wie der folgenden, werden Sie bekommen, was Sie wollen:InformationsquelleAutor Marcus Adams
Können Sie auch vereinfachen-Abfrage:
InformationsquelleAutor rightfold