2010-08-20 12 views
85

Chcę użyć porządku przez zjednoczenie w zapytaniu 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 przeszukiwaniem miejsca. Drugie zapytanie wybierające zwraca dane dotyczące odległości w odległości 5 km od szukanego miejsca. Trzecie zapytanie wybierające zwraca dane związane z odległością w odległości 5-15 km od szukanego miejsca.Używanie związków i porządek według klauzuli w mysql

Następnie używam union, aby scalić wszystkie wyniki i pokazać na stronie z stronicowaniem. Pod właściwą nazwą jako „dokładnym Wyniki wyszukiwania”, „Wyniki w ciągu 5 kms” itp

Teraz chcę, aby posortować wyniki na podstawie dowodu osobistego lub add_date. Ale kiedy dodaję porządek według zdania na końcu mojego zapytania (zapytanie 1 połączenie zapytanie 2 połączenie zapytanie 3 zamówienie przez add_date). Sortuje wszystkie wyniki. Ale to, czego chcę, powinno się sortować pod każdym nagłówkiem.

+0

Jakim typem (-ami) jest (są) pola (-y), które chcesz posortować według w każdej tabeli? – user151841

Odpowiedz

163

można to zrobić poprzez dodanie pseudo-kolumna o nazwie rangi każdemu wybrać, które można sortować według pierwszego, przed sortowaniem przez swoich innych kryteriów, np:

select * 
from (
    select 1 as Rank, id, add_date from Table 
    union all 
    select 2 as Rank, id, add_date from Table where distance < 5 
    union all 
    select 3 as Rank, id, add_date from Table where distance between 5 and 15 
) a 
order by rank, id, add_date desc 
+0

Cześć, dziękuję za to, dokładnie używam w ten sposób. Ale chcę, aby sortować wynik zapytania na podstawie add_date w porządku malejącym. – Aditya

+0

Możesz użyć słowa kluczowego 'desc'. Zaktualizowałem powyższe zapytanie. – RedFilter

+0

Właśnie dokonałem szybkiej zmiany kodów, a wyniki były niesamowite. Zrobiłeś mój dzień. Dzięki – Aditya

0

Spróbuj:

SELECT result.* 
FROM (
[QUERY 1] 
UNION 
[QUERY 2] 
) result 
ORDER BY result.id 

Gdzie [QUERY 1] i [QUERY 2] są Twoje dwa pytania, które chcesz scalić.

0

To dlatego, że jesteś na wyniki sortowania cały zestaw, należy uporządkować, każdą część unii oddzielnie lub można użyć ORDER BY (coś tj. Podzapytanie odległość) THEN (coś znaczy rząd id) klauzula

4

zapytanie związek może mieć tylko jeden główny ORDER BY klauzuli , IIRC. Aby to uzyskać, w każdym zapytaniu składającym się na większą kwerendę UNION dodaj pole, które będzie jednym z pól, które sortujesz dla UNION 's ORDER BY.

Na przykład, możesz mieć coś podobnego

SELECT field1, field2, '1' AS union_sort 
UNION SELECT field1, field2, '2' AS union_sort 
UNION SELECT field1, field2, '3' AS union_sort 
ORDER BY union_sort 

To union_sort pole może być cokolwiek może chcesz sortować. W tym przykładzie, to właśnie dzieje się umieścić wyniki z pierwszej tabeli pierwszej, drugiej tabeli drugie itd

38

Można użyć podzapytania, aby to zrobić:

select * from (select values1 from table1 order by orderby1) as a 
union all 
select * from (select values2 from table2 order by orderby2) as b 
+1

Tnx, dobry do rozdzielania zamówień. Również możemy mieć inny układ, jeśli klauzula zamówienie było powszechne, ale chcemy wyniki oddzielone (zamiast oddzielających zamówień): 'select * from ( Select AAA AS COL 1 jako urzędnik z tabela1 UNION ALL SELECT bbb AS Col, 0 AS Official FROM table2 ) AS tbl ZAMÓW PRZEZ Official, Col' – Alix

+6

To jest [nieprawidłowe] (http://dev.mysql.com/doc/refman/5.7/en/union.html): * użycie 'ORDER BY' dla poszczególnych instrukcji' SELECT' nie implikuje niczego w kolejności, w której wiersze pojawiają się w końcowym wyniku * – shmosel

+0

Masz rację, zaakceptowana odpowiedź jest również poprawna. To się po prostu sprawdziło, kiedy testowałem. – rickythefox

0

Próbowałem dodanie zamówienia przez każdego z kwerendy przed ujednoliceniem jak , ale wydawało się, że nie działa. W rzeczywistości nie dokonano porządkowania w wierszach od każdego wyboru.

myślę, że trzeba zachować porządek przez na zewnątrz i dodać kolumny w klauzuli WHERE do porządku przez coś jak

(select * from table where distance=0) 
union 
(select * from table where distance>0 and distance<=5) 
order by distance, add_date 

To może być trochę trudne, ponieważ chcesz grupy według zakresów, ale myślę, że powinno to być wykonalne.

+0

user151841 pomysł union_sort poniżej byłby dobrym sposobem na obsłużenie grupy –

2

Mam to działa na łączeniu i związku.

(SELECT 
    table1.column1, 
    table1.column2, 
    foo1.column4 
FROM table1, table2, foo1, table5 
WHERE table5.somerecord = table1.column1 
ORDER BY table1.column1 ASC, table1.column2 DESC 
) 

UNION 

(SELECT 
    ... Another complex query as above 
) 

ORDER BY column1 DESC, column2 ASC 
23
(select add_date,col2 from table_name) 
    union 
(select add_date,col2 from table_name) 
    union 
(select add_date,col2 from table_name) 

order by add_date 
+0

To zadziałało, ale dziwnie musiałem zmienić jedną rzecz: musiałem dać wspólny alias do pola, które zamawiał. Pracował poza tym, dzięki! – HoldOffHunger

6

Nie zapomnij, unia wszystko jest sposób, aby dodać rekordy do zestawu rekord bez sortowania lub łączenie (w przeciwieństwie do unii).

Tak na przykład:

select * from (
    select col1, col2 
    from table a 
    <....> 
    order by col3 
    limit by 200 
) a 
union all 
select * from (
    select cola, colb 
    from table b 
    <....> 
    order by colb 
    limit by 300 
) b 

Utrzymuje poszczególne pytania jaśniejsze i pozwala sortować według różnych parametrów w każdym zapytaniu. Jednak przy użyciu wybranego sposobu odpowiedzi może stać się jaśniejszy w zależności od złożoności i pokrewnych danych, ponieważ konceptualizujesz sortowanie. Pozwala także zwrócić sztuczną kolumnę do programu zapytującego, dzięki czemu ma kontekst, w którym może sortować lub organizować.

Ale ten sposób ma tę zaletę, że jest szybki, nie wprowadza dodatkowych zmiennych i ułatwia rozdzielenie każdego zapytania, w tym sortowania. Możliwość dodania limitu to po prostu dodatkowy bonus.

Oczywiście nie wahaj się, aby połączyć wszystkie elementy w całość i dodać sortowanie dla całego zapytania. Lub dodaj sztuczny identyfikator, w którym to przypadku w ten sposób łatwiej jest sortować według różnych parametrów w każdym zapytaniu, ale w przeciwnym razie jest on taki sam jak zaakceptowana odpowiedź.

Powiązane problemy