我正试图编写一个sql查询来列出数据库中的所有报价,但首先要按rand检索优先级NOT NULL顺序,然后按id检索优先级NULL顺序。
我做了一些这样的东西:
(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(),因为我知道这太慢了?
来自文档:
要将ORDER BY或LIMIT应用于单个SELECT,请放置子句在包含SELECT:的括号内
(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_prioriitar is NULL)ASC在不为NULL时将给出false(0),在为NULL时给出true(1)。由于它正在排序ASC,0将比1先出现。
您可以通过创建用于排序的伪列!
试试这个:
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