2010-07-04 74 views
8

tôi muốn nhận được từ một bảng duy nhất, tất cả các hàng, nhưng đặt chúng theo những cách khác nhau. Ví dụ tôi viếtSELECT UNION và ORDER BY trong mysql .. làm thế nào?

(SELECT * FROM table1 
ORDER BY fieldA ASC LIMIT 3 
) 
UNION 
(
SELECT * FROM table1 
ORDER BY FieldB DESC 
) 

Nó hoạt động, excpet rằng thứ tự thứ hai bằng cách (FIELDB DESC) bị lờ đi ... Ai đó biết Tại sao? Cảm ơn bạn

+2

Xem [UNION Cú pháp] (http://dev.mysql.com/doc/refman/5.0/en/union.html) . Tìm 'sử dụng ORDER BY cho các câu lệnh SELECT riêng lẻ ngụ ý không có gì về thứ tự'. Ngoài ra, hãy xem [bài đăng SO này] (http://stackoverflow.com/questions/3163503/sorting-union-queries-in-mysql/3163526#3163526). – Mike

+0

wow, nó hoạt động ... nhưng nó có thể hoạt động như thế nào? mmm .. Tôi hơi bối rối ..! – stighy

Trả lời

17

Nhà điều hành UNION thực hiện một loại được ngụ ý như một phần của hoạt động công đoàn (IIRC, trên cột chính).

Nếu bạn muốn sắp xếp khác trong kết quả, bạn phải áp dụng ORDER BY cho lựa chọn được kết hợp.

Trong trường hợp của bạn, bạn cần một số cách để phân biệt giữa lựa chọn đầu tiên và lựa chọn thứ hai, để bạn có thể đặt hàng công đoàn đúng cách. Một cái gì đó tương tự (chưa được kiểm tra):

(SELECT table1.*, 0 AS TMP_ORDER FROM table1 ORDER BY fieldA ASC LIMIT 3) 
UNION 
(SELECT table1.*, 1 AS TMP_ORDER FROM table1) 
ORDER BY TMP_ORDER ASC, 
CASE WHEN TMP_ORDER = 0 THEN fieldA ELSE 0 END ASC, 
CASE WHEN TMP_ORDER = 1 THEN fieldB ELSE 0 END DESC 

Vấn đề với phương pháp này là bạn sẽ có bản sao cho ba hàng lựa chọn như là một phần của truy vấn đầu tiên trong UNION (kể từ khi các cột không hoàn toàn phù hợp).

Bạn có chắc chắn không thể sử dụng hai số liệu SELECT thay thế không?

+0

@ Tương tự, câu hỏi đó không yêu cầu phân loại riêng biệt dựa trên unionorder. Đó là nơi mà câu lệnh 'CASE' xuất hiện. –

+0

' select * 'bên ngoài là không cần thiết, cũng như truy vấn bên trong' order by' không làm bất cứ điều gì trong truy vấn thứ 2 vì không có giới hạn: '(select t1. *, 0 tmp_order từ t1 order by fieldA asc limit 3) union (chọn t2. *, 1 from t2) theo thứ tự tmp_order, case ... ' – Donnie

+0

+1 @Mike - chỉ trả lời các câu hỏi con mà dữ liệu đến từ , không có cấp độ thứ hai để đảm bảo FieldA và FieldB cũng được sắp xếp từ các truy vấn tương ứng của chúng. Câu trả lời ở đây bao gồm sắp xếp cấp độ thứ hai. – mdma

1

Bạn có thể khai báo thứ hai SELECT như là kết quả cố định ..

SELECT 'First select option' AS something 

UNION 

SELECT something 
FROM(
    (SELECT something 
    FROM SomeTable 
    ORDER BY something ASC)) FixedResult