我正在尝试编写一个sql查询来列出来自数据库的所有商品,但首先按照rand然后按优先级按ID排序优先级NOT 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()因为我知道这太慢了吗?
答案 0 :(得分:0)
您可以按订单制作虚拟列!
试试这个:
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
答案 1 :(得分:0)
UNION的各个部分中的ORDER BY仅在向该特定部分添加LIMIT子句时才有用,否则将被忽略。
来自docs:
要将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_prioritar IS NULL)当ASC不为NULL时,ASC将给出false(0);当它为NULL时,ASC将给出true(1)。由于它是在订购ASC,因此首先出现的是0。