是否可以在单个查询中使用order by和where

pra*_*pal 5 mysql sql caching

我创建了一张桌子.在一个字段中,我具有该记录的优先级(1-9之间).我没有为所有记录设置优先级,因此对于某些记录,它将保持为空.

在我的HTML页面中显示这些记录时,我只检查这些优先级 - 如果优先级存在,那么我将按原样显示,如果它为空,那么我将它显示为'10'的最低优先级(仅用于显示) ).

排序表时出现问题.如果我尝试使用sort(DESC)该表,它会在第一行显示10,然后继续完美(1,2,....).

怎么解决这个?

是否可以先显示优先级,然后继续显示空值?

pax*_*blo 2

有多种方法可以解决这个问题。

1/ 更改数据,使 10 实际上在表中(而不是 NULL):

update table TBL set FLD = 10 where FLD is null;
Run Code Online (Sandbox Code Playgroud)

2/ 修改查询以返回不同的 NULL 值:

select FLD1, FLD2, case where FLD3 is null then 10 else FLD3 end from ...
Run Code Online (Sandbox Code Playgroud)

3/ 创建一个视图来自动执行上述选项 2。

我倾向于选择选项 1,因为它可能是最有效的。

SQL 没有指定 NULL 的排序方式(尽管我认为它指定它们必须是相邻的)——这意味着它们可能位于开头或结尾(或者可能位于中间,尽管我从未见过这种情况发生)。

我提出效率方面的原因是每行函数不能很好地扩展。随着表变得越来越大,你会发现每次选择时将 NULL 转换为 10 的开销会非常大。

最好还是硬着头皮在数据库中将它们设置为 10。这将使 DBMS 更好地优化查询。而且,如果您需要使用 10 作为另一个实际优先级,只需在开始之前将所有当前的 10 更改为 11(或 9999)即可。