SQL:UNION realestate优先级提供

时间:2013-12-09 09:18:51

标签: mysql sql database

我正在尝试编写一个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()因为我知道这太慢了吗?

2 个答案:

答案 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。