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出現。
而在這種情況下,如何使用另一種RAND()替代品?據我所知,蘭德()太慢,建議避免。 – oriceon