2009-11-17 45 views
0

我有一个查询,我需要修改选定的数据,我想限制我的结果的数据。例如:Codeigniter WHERE“AS”字段

SELECT table_id,弧度(25)AS rad FROM test_table WHERE rad < 5 ORDER BY rad ASC;

这里挂起的是'rad < 5',因为根据codeigniter没有'rad'列。我试过把它写成一个自定义查询($ this-> db-> query(...)),但即使这样也不会让我。我需要根据这个字段来限制我的结果。哦,如果我删除了WHERE过滤器,那么ORDER BY就可以完美工作。结果是rad场的顺序ASC。

帮助!!!

回答

0

与众多的DBMS,我们需要重复where子句中的公式/表达式,即

SELECT table_id, radians(25) AS rad 
FROM test_table 
WHERE radians(25) < 5 
ORDER BY radians(25) ASC 

然而,在这种情况下,由于计算列是一个常数,查询本身并不能使很有道理。是否可能缺少一部分,如弧度(25 * myColumn)或类似的东西?

编辑
你似乎很失望(约配方等的真实性质以下信息),因为该公式需要重复......上几点意见:

的事实,公式需要明确拼写而不是别名可能会使查询更不可读,写作乐趣更少等(下文详述),但更重要的因素要考虑是在WHERE中使用的公式子句会导致DBMS为潜在的所有记录计算此值躺在桌子上!

这轮流伤害性能在几个方面:

  • SQL可能不能够使用的一些索引,而不是必须扫描表(或其部分)
  • 如果公式是沉重的,它无论是响应速度慢和少一个可扩展的服务器

的情况不是很糟糕,如果在附加谓词的WHERE子句允许SQL过滤掉,使[的显著量]记录了WO否则将被处理。这些额外的搜索标准可能由应用程序驱动(例如,除辐射外的此条件,位置的[不相关]高度要求低于6000英尺)之外,或者可以“人为”添加此类标准以帮助该查询(例如,您可能知道一个粗略的启发式算法,该算法不足以在可接受的精度内计算“弧度”值,但可能还不足以过滤70%的记录,只保留这些有可能。对于满足公式本身所需的“弧度”

现在一些技巧的确切范围,企图使其更快:

  • 记住,你可能并不需要ŧ Ø运行100%的教科书公式。
    我不确定大圆圈数学的哪一部分与这个弧度计算有关,但用通用术语来说,一些公式包含一个昂贵的步骤,例如平方根提取,对三角函数的调用等。在某些情况下,可以通过将步骤应用于谓词的另一侧(通常只需要评估一次)来简化公式(其必须针对多个记录/值运行)。例如,如果说搜索条件谓词是"WHERE SQRT((x1-x2)^2 + (y1-y2)^2) > 5"。由于距离的计算涉及找到平方根的平方根,所以可以决定去除平方根,而是将该修改后的公式的结果与距离值的平方作比较,即"WHERE ((x1-x2)^2 + (y1-y2)^2) > (5^2)"
  • 根据您的SQL/DBMS系统,可以在自定义函数中实现该公式,这将使其更有效(因为“预编译”,可能是用更好的语言编写的),并且更短在SQL查询本身中引用(事件虽然需要被列为两次,如上所述)
  • 根据情况,还可能更改数据库模式和基础应用程序,使公式(或其部分) ),但预先计算和索引,保存DBMS这个冗长的决议基于函数的谓词。
+0

25的值是动态的,我想这将是答案,不幸的是不是我正在寻找的那个。我使用的实际表达是“大圆圈”。所以这是一个相当大的计算/表达。谢谢。 – phxis 2009-11-17 15:36:45

+0

@phxis:查看有关在where子句中使用公式的问题的附加信息,以及抵消此责任的方法。 – mjv 2009-11-17 16:34:08