2010-07-04 15 views
8

Tek bir tablodan tüm satırları almak istiyorum, ancak bunları farklı yollarla sipariş ediyorum. Örneğin i (Fieldb DESC) tarafından ikinci dereceden gözardı edilmiyor excpet, SELECT UNION ve ORDER BY mysql .. nasıl yapılır?

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

Çalışıyor

yazmak ... Biri Neden biliyor musunuz? Teşekkür ederiz

+2

bakınız [UNION sözdizimi] (http://dev.mysql.com/doc/refman/5.0/en/union.html) . 'SELECT ifadeleri için SİPARİŞ'in kullanılması, siparişle ilgili hiçbir şey ifade etmemektedir'. Ayrıca bkz. [Bu SO gönderisi] (http://stackoverflow.com/questions/3163503/sorting-union-queries-in-mysql/3163526#3163526). – Mike

+0

Vay, işe yaradı ... ama nasıl çalışır? mmm .. biraz kafam karıştı ..! – stighy

cevap

17

UNION işleci, birleştirme işleminin bir parçası olarak (anahtar sütun (lar) da IIRC) örtülü bir sıralama gerçekleştirir. Sonucun sıralama diğer istiyorsanız

, sen unioned seçime bir ORDER BY uygulamak zorunda. Senin durumunda

, düzgün şekilde sendikaya sipariş edebilirsiniz, böylece ilk seçimi ve ikinci ayırt etmenin bir yolunu gerekir. (Denenmemiş) gibi bir şey: Bu yaklaşım ile

(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 

sorun UNION ilk sorgusu (sütunlar tamamen uyuşmuyor beri) bir parçası olarak seçilen üç satırlar için çiftleri gerekecek olmasıdır.

Eğer iki SELECT statments yerine kullanamaz emin misin? Sabit bir sonucu olarak, ikinci SELECT ilan edebilir

+0

@Mike, bu soru sendikaya dayalı ayrı sıralama gerektirmiyor. 'CASE' ifadesinin içeriye girdiği yer burasıdır. –

+0

Dış 'select *' gerekli değil, iç sorgunun yanı sıra 2. sorguda 2. sorguda hiçbir şey yapmadığı için gerekli değildir: '(t1'i seçin. * fieldA asc limiti 3) sendika tarafından t1 siparişinden 0 tmp_order (t2 seçmek *, tmp_order, vaka tarafından sırayla) t2 1 ... ' – Donnie

+0

1 @ Mike -. sadece türlü hangi veri geldi alt sorgu cevap FieldA ve FieldB'nin kendi sorgularından da ayrılmasını sağlamak için ikinci seviye sıralama yoktur. Cevap, ikinci seviye sıralamasını içerir. – mdma

1

..

SELECT 'First select option' AS something 

UNION 

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