Chcę użyć kolejności według z unią w kwerendzie mysql. Pobieram różne typy rekordów na podstawie różnych kryteriów z tabeli opartej na odległości dla wyszukiwania w mojej witrynie. Pierwsze zapytanie wybierające zwraca dane związane z dokładnym wyszukiwaniem miejsca. Drugie zapytanie wybierające zwraca dane dotyczące odległości w promieniu 5 km od wyszukiwanego miejsca. Trzecie zapytanie wybierające zwraca dane dotyczące odległości w promieniu 5-15 km od wyszukiwanego miejsca.
Następnie używam union do scalenia wszystkich wyników i wyświetlenia ich na stronie ze stronicowaniem. Pod odpowiednim nagłówkiem „Dokładne wyniki wyszukiwania” , „Wyniki w promieniu 5 km” itp
Teraz chcę posortować wyniki na podstawie identyfikatora lub add_date. Ale kiedy dodam klauzulę order by na końcu mojego zapytania (query1 union query 2 union query 3 order by add_date). Sortuje wszystkie wyniki. Ale to, czego chcę, to sortowanie pod każdym nagłówkiem.
źródło
Odpowiedzi:
Możesz to zrobić, dodając pseudokolumnę o nazwie rank do każdego wyboru, według której możesz najpierw posortować, przed sortowaniem według innych kryteriów, np .:
źródło
a
i koniec?order by
? ( „aby posortować lub ograniczyć całyUNION
wynik,SELECT
umieść poszczególne instrukcje w nawiasach i umieśćORDER BY
lubLIMIT
po ostatniej” ). Porównaj swój kod z i.stack.imgur.com/LpTMU.pngAby to zrobić, możesz użyć podzapytań:
źródło
SELECT * FROM ( SELECT aaa AS Col, 1 AS Official FROM table1 UNION ALL SELECT bbb AS Col, 0 AS Official FROM table2 ) AS tbl ORDER BY Official, Col
ORDER BY
dla poszczególnychSELECT
stwierdzeń nie oznacza nic o kolejności, w jakiej wiersze pojawiają się w wyniku końcowymźródło
Zapytanie składające może mieć tylko jedną
ORDER BY
klauzulę główną , IIRC. Aby to uzyskać, w każdej kwerendy tworzącej większąUNION
zapytanie, dodać pole to będzie jedno pole sortować według dlaUNION
„sORDER BY
.Na przykład możesz mieć coś takiego
To
union_sort
pole może zawierać dowolne informacje, według których chcesz sortować. W tym przykładzie zdarza się, że najpierw umieszcza się wyniki z pierwszej tabeli, drugiej tabeli itd.źródło
Nie zapominaj, że łączenie wszystkich jest sposobem dodawania rekordów do zestawu rekordów bez sortowania lub scalania (w przeciwieństwie do sumowania).
Na przykład:
Zapewnia przejrzystość poszczególnych zapytań i umożliwia sortowanie według różnych parametrów w każdym zapytaniu. Jednak korzystając z wybranej odpowiedzi, może stać się jaśniejsze w zależności od złożoności i stopnia powiązania danych, ponieważ konceptualizujesz sortowanie. Umożliwia także zwrócenie sztucznej kolumny do programu wysyłającego zapytania, aby miała kontekst, według którego może sortować lub organizować.
Ale ten sposób ma tę zaletę, że jest szybki, nie wprowadza dodatkowych zmiennych i ułatwia oddzielenie każdego zapytania, w tym sortowania. Możliwość dodania limitu to po prostu dodatkowy bonus.
I oczywiście możesz zamienić całą unię w sumę i dodać sortowanie dla całego zapytania. Lub dodaj sztuczny identyfikator, w którym to przypadku ułatwi to sortowanie według różnych parametrów w każdym zapytaniu, ale poza tym jest to to samo, co zaakceptowana odpowiedź.
źródło
Mam to, pracując nad związkiem typu Join plus.
źródło
Użycie
ORDER BY
klauzuli wewnątrz zapytania podrzędnego w połączeniu zUNION
mysql zoptymalizujeORDER BY
klauzulę.Dzieje się tak, ponieważ domyślnie a
UNION
zwraca nieuporządkowaną listę, więcORDER BY
nie zrobiłby nic.Optymalizacja jest wspomniana w dokumentacji i mówi:
Ostatnie zdanie jest trochę mylące, ponieważ powinno mieć skutek. Ta optymalizacja powoduje problem w sytuacji, w której musisz złożyć zamówienie w podzapytaniu.
Aby zmusić MySQL do nie przeprowadzania tej optymalizacji, możesz dodać klauzulę LIMIT w następujący sposób:
Wysoka
LIMIT
oznacza, że możesz dodaćOFFSET
do ogólnego zapytania, jeśli chcesz zrobić coś, na przykład paginację.Daje to również dodatkową korzyść w postaci możliwości
ORDER BY
różnych kolumn dla każdej unii.źródło
Próbować:
Gdzie [QUERY 1] i [QUERY 2] to dwa zapytania, które chcesz scalić.
źródło
Dzieje się tak, ponieważ sortujesz cały zbiór wyników, powinieneś sortować każdą część unii osobno, lub możesz użyć klauzuli ORDER BY (coś, np. Odległość podzapytania) THEN (coś, czyli identyfikator wiersza)
źródło
Próbowałem dodać kolejność do każdego z zapytań przed połączeniem, np
ale to nie działało. W rzeczywistości nie uporządkował w wierszach z każdego wyboru.
Myślę, że będziesz musiał zachować kolejność na zewnątrz i dodać kolumny w klauzuli Where do zamówienia, coś w stylu
Może to być trochę trudne, ponieważ chcesz grupować według zakresów, ale myślę, że powinno to być wykonalne.
źródło