Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL:联合房地产优先权优惠_Mysql_Sql_Database - Fatal编程技术网

Mysql SQL:联合房地产优先权优惠

Mysql SQL:联合房地产优先权优惠,mysql,sql,database,Mysql,Sql,Database,我试图编写一个sql查询来列出数据库中的所有报价,但首先要按兰德检索优先级非空顺序,然后按id检索优先级空顺序 我做了一些这样的事情: (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_p

我试图编写一个sql查询来列出数据库中的所有报价,但首先要按兰德检索优先级非空顺序,然后按id检索优先级空顺序

我做了一些这样的事情:

(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创建虚拟列

试试这个:

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

只有将限制子句添加到特定部分时,UNION各个部分中的ORDER BY才有用,否则将忽略它

从:

若要对单个SELECT应用ORDER BY或LIMIT,请放置子句 在括住“选择”框的括号内:

但是,对单个SELECT语句使用ORDER BY意味着 与行在最终结果中的显示顺序无关 因为默认情况下,UNION生成一组无序的行。因此 在这种情况下,ORDER BY的使用通常与 限制,以便用于确定选定行的子集 为SELECT检索,即使它不一定会影响 这些行在最终联合结果中的顺序。如果出现“订购方式” 在选择中没有限制,它被优化了,因为它将 反正没有效果

如果希望首先对结果的第一部分进行排序,则必须以某种方式解决此问题:

(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

order by:anunt\u lista\u is\u prioritar is NULL的第一个子句ASC将在不为NULL时给出false 0,在为NULL时给出true 1。由于是订购ASC,0将比1先出现。

在这种情况下,我如何使用兰德的其他替代品?据我所知,RAND速度太慢,建议避免使用。
(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