【问题标题】:Is it possible to use both order by and where in a single query是否可以在单个查询中同时使用 order by 和 where
【发布时间】:2009-07-17 07:45:40
【问题描述】:

我已经创建了一个表。在一个领域,我有该记录的优先级(1-9 之间)。 我没有为所有记录设置优先级,因此对于某些记录,它将保持为空。

当在我的 HTML 页面中显示这些记录时,我只检查这些优先级——如果优先级存在,那么我将按原样显示,如果它为空,那么我将其显示为最低优先级“10”(只是为了展示)。

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

如何解决?

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

【问题讨论】:

  • 您能提供您正在使用的完整 SQL 查询吗?
  • 按优先级降序从优先顺序中选择优先级

标签: sql mysql caching


【解决方案1】:

这是一个简短的示例,展示了如何将 NULL 转换为一个值,然后对其进行排序..

create table test
(
    priority int null,
    detail varchar(10)
)

insert into test values (1, 'one')
insert into test values (3, 'three')
insert into test values (8, 'eight')
insert into test values (9, 'nine')
insert into test values (null, 'ten')

select ISNULL(priority, 10), detail from test order by ISNULL(priority, 10)

关键是 ISNULL'ing 可空值字段以将 NULL 转换为您想要的值 (10)。

【讨论】:

  • 这对于较小的表来说很好,只是要注意每行函数不能很好地扩展。
  • 从最好的意义上说,“垃圾”——我曾在一个系统上工作过,在该系统中,表中存在空值,该表相当宽且相当长(大约 5 多万条记录),并且性能已经绰绰有余(包括复杂连接查询中使用的数据)。那是使用 Sql Server 2000,我想 2k5/2k8 会一样好,如果不是更好的话。另一方面,MySql - 好吧,它做得不好,所以谁知道;-)
  • 我刚刚对此进行了微基准测试(2 列表,655k 行,20% 优先级为空,80% 在 [1,3,8,9} 之间等分)和每次执行超过 4 次,性能没有显着差异。
  • +1 简单的解决方案,效果很好。我也不认为 Pax 的评论是相关的——你有没有展示过一张大桌子的全部内容?在网页上?我从来没有遇到过 isnull 的性能问题,但如果有的话,在这种情况下就不会成为问题。
  • 五百万行并不是一张大表。它可能适用于您的 PC 类型的数据库,但它可能位于大型机上小表的高端。我很小心不要说你的答案是错误的,因为这完全取决于表的大小。我自己,我更喜欢针对更一般的情况给出答案,这就是我没有评论 MySQL 的原因。
【解决方案2】:

有很多方法可以解决它。

1/ 改变数据,让10实际在表中(而不是NULL):

update table TBL set FLD = 10 where FLD is null;

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

select FLD1, FLD2, case where FLD3 is null then 10 else FLD3 end from ...

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

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

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

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

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

【讨论】:

    【解决方案3】:

    如果您希望 NULL 优先级的记录最后出现,我会推荐类似

    ORDER BY (IFNULL(Priority, 1000000)) 或类似的东西

    【讨论】:

    • 用户最终将插入优先级为 1000001 的记录。我会使用 ORDER BY CASE WHEN Priority IS NULL THEN 1 ELSE 0 END, Priority 来确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-24
    • 2021-08-25
    相关资源
    最近更新 更多