2011-06-01 29 views
19

Amacım, iki farklı sorgu yürütmek ve daha sonra bunları birleştirmektir.
Benim kodudur:UNION, SİPARİŞ BY ve LIMIT

SELECT * FROM some tables WHERE ... ORDER BY field1 LIMIT 0,1 
UNION 
SELECT * FROM some tables WHERE ... 

aşağıdaki hatayı alıyorum:

#1221 - Incorrect usage of UNION and ORDER BY

O SİPARİŞ BY sadece ilk sorgu için olması önemlidir. Bu görevi nasıl yapabilirim?

+1

bu [öğretici] (http okuyun. org/sql-union-mysql.aspx) – luca

cevap

24

kullanabilirsiniz kopyalar parantez bireysel sorgularda ORDER/LIMIT kullanımına izin vermek:

(SELECT * FROM some tables WHERE ... ORDER BY field1 LIMIT 0, 1) 
UNION 
(SELECT * FROM some tables WHERE ...) 
ORDER BY 1 /* optional -- applies to the UNIONed result */ 
LIMIT 0, 100 /* optional -- applies to the UNIONed result */ 
+2

sözdizimi hatası ... aliased (parantezli) seçimini seçmeniz gerekiyor – Bohemian

+0

Hiçbir sözdizimi hatası yok, sadece kontrol ettim! –

+0

hmmm - Ben de kontrol ettim ve hatayı aldım. Belki de mysql'imi yükseltmem gerek. Afedersiniz! – Bohemian

8
SELECT * FROM (SELECT * FROM some tables WHERE ... ORDER BY field1 LIMIT 0,1) x 
UNION ALL 
SELECT * FROM some tables WHERE ... 

Not UNION ALL kullanımı:

  • UNION set sonucu ve DB siparişleri yinelenen satırları kaldırır bunu yapmadan önce satırları (böylece tüm sonuç kümesini sıralanır) Tüm
  • UNION ALL düzeni hem korur ve
2

sadece yuvarlak parantez içinde her şeyi koymak: //www.mysqltutorial:

(SELECT * FROM table1 ORDER BY datetime ) 
UNION 
(SELECT * FROM table2 ORDER BY datetime DESC) 
+1

sözdizimi hatası ... seçmeli (parantezli) seçimini seçmeniz gerekiyor – Bohemian

+0

[docs] (http://www.mysqltutorial.org/sql-union-mysql.aspx) Nerede okudunuz? – luca

+0

Kontrol ettim ve hatayı aldım. Belki de mysql'imi yükseltmem gerek. Afedersiniz! – Bohemian

1
(SELECT user_id AS id FROM tbl_user) 
UNION 
(SELECT address_id AS id FROM tbl_address) 
ORDER BY id ASC LIMIT 10