2013-12-09 66 views
0

我想寫一個SQL查詢來列出所有來自數據庫的提供,但首先要檢索優先級NOT NULL訂單由蘭然後優先級按ID排序NULL。SQL:UNION房地產優先提供

I`ve做出某種這樣的:

(SELECT anunt_lista_id 
FROM anunturi__lista 
WHERE anunt_lista_is_prioritar IS NOT NULL 
ORDER BY RAND()) 
UNION 
(SELECT anunt_lista_id 
FROM anunturi__lista 
WHERE anunt_lista_is_prioritar IS NULL 
ORDER BY anunt_lista_id ASC) 
LIMIT 100 

但ORDER BY被忽略,沒有人被應用。

還有另一種方法來使用另一種方式來做RAND(),因爲我知道這太慢了?

回答

0

ORDER BY UNION中的各個部分是唯一有用的,否則它會被忽略。

docs

通過或LIMIT應用於爲了將個人選擇,將條款 圍繞該選擇的括號內:

(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) 
UNION 
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10); 

然而,對單個SELECT語句使用ORDER BY意味着 沒有任何關於行在最終結果中出現的順序 ,因爲默認情況下UNION會生成無序的一組行。因此, 在此上下文中使用ORDER BY通常與 LIMIT結合使用,以便它用於確定要爲SELECT檢索的選定行的子集 ,即使它不一定會影響 的順序最後的UNION結果中的那些行。如果ORDER BY在SELECT中沒有LIMIT出現 ,它會被優化掉,因爲它無論如何都會對 沒有影響。

如果你想要的結果的第一部分首先被排序,你必須要解決它以某種方式:

(SELECT anunt_lista_id 
FROM anunturi__lista 
WHERE anunt_lista_is_prioritar IS NOT NULL) 
UNION 
(SELECT anunt_lista_id 
FROM anunturi__lista 
WHERE anunt_lista_is_prioritar IS NULL) 
ORDER BY (anunt_lista_is_prioritar IS NULL) ASC, 
     CASE WHEN anunt_lista_is_prioritar IS NOT NULL THEN 
     RAND() 
     ELSE anunt_lista_id END 
LIMIT 100 

的順序由第一條:(anunt_lista_is_prioritar IS NULL)ASC當它不是NULL時會給出false(0),當它爲NULL時會給出true(1)。由於它正在訂購ASC,因此0會先於1出現。

+0

而在這種情況下,如何使用另一種RAND()替代品?據我所知,蘭德()太慢,建議避免。 – oriceon

0

您可以製作虛擬列以進行排序!

試試這個:當您添加LIMIT子句特定部分

SELECT 
if(anunt_lista_is_prioritar IS NOT NULL, rand() , 0) as fld_1, 
if(anunt_lista_is_prioritar IS NULL,anunt_lista_id , 0) as fld_2, 
anunt_lista_id 
FROM anunturi__lista 
order by fld_1 desc , fld_2 asc 
Limit 100