Activerecord Codeigniter在“on”位置;作为「;领域

Activerecord Codeigniter在“on”位置;作为「;领域,activerecord,codeigniter,where-clause,Activerecord,Codeigniter,Where Clause,我有一个需要修改所选数据的查询,我想限制该数据的结果。例如: 从测试_表中选择表_id,弧度(25)作为rad,其中radquery(…))编写,但即使这样也不允许。我需要基于此字段限制我的结果。哦,如果我去掉WHERE过滤器,ORDER BY的工作就完美了。结果按rad字段的顺序为ASC 救命啊 对于许多DBMS,我们需要重复where子句中的公式/表达式,即 SELECT table_id, radians( 25 ) AS rad FROM test_table WHERE radia

我有一个需要修改所选数据的查询,我想限制该数据的结果。例如:

从测试_表中选择表_id,弧度(25)作为rad,其中rad<5 ORDER BY rad ASC

挂起的地方是“rad<5”,因为根据codeigniter,没有“rad”列。我曾尝试将其作为一个自定义查询($this->db->query(…))编写,但即使这样也不允许。我需要基于此字段限制我的结果。哦,如果我去掉WHERE过滤器,ORDER BY的工作就完美了。结果按rad字段的顺序为ASC


救命啊

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

SELECT table_id, radians( 25 ) AS rad 
FROM test_table 
WHERE radians( 25 ) < 5 
ORDER BY radians( 25 ) ASC
选择表id,弧度(25)为rad
从测试表
其中弧度(25)<5
按弧度排序(25)ASC
但是,在本例中,由于计算列是常量,因此查询本身没有多大意义。是否有缺失的部分,比如说弧度(25*myColumn)或类似的东西

编辑(以下是有关公式真实性质的信息等)
你看起来很失望,因为这个公式需要重复。。。对此有几点评论:

公式需要显式拼写而不是别名,这一事实可能会降低查询的可读性,降低编写的乐趣等(下文将对此进行详细介绍),但是,需要考虑的更重要的因素是,WHERE子句中使用的公式会导致DBMS为基础表中的所有记录计算该值

这反过来会在几个方面影响性能:

  • SQL可能无法使用某些索引,而必须扫描表(或部分表)
  • 如果公式很重,那么它既会导致响应速度慢,也会导致服务器伸缩性差
如果WHERE子句中的附加谓词允许SQL过滤掉[大量]否则将被处理的记录,那么情况就没有那么糟糕了。此类附加搜索条件可由应用程序驱动(例如,除了辐射条件外,要求位置的[无关]高度低于6000英尺),或者此类条件可“人为”添加以帮助查询(例如,您可能知道一种粗略的启发式方法,它不足以在可接受的精度范围内计算“弧度”值,但可能足以过滤掉70%的记录,只保留那些有机会满足“弧度”精确范围的记录。)

现在,关于公式本身的一些技巧,试图使其更快:

  • 请记住,您可能不需要运行100%的教科书公式。
    我不确定大圆数学的哪一部分与弧度计算有关,但一般来说,一些公式包括昂贵的步骤,如平方根提取、调用三角函数等。在某些情况下,可以简化公式(必须对许多记录/值运行),将相反的步骤应用到谓词的另一侧(通常只需要计算一次)。例如,如果假设搜索条件谓词为
    ,其中SQRT((x1-x2)^2+(y1-y2)^2)>5”
    。因为距离的计算涉及到求(平方差之和)的平方根,可以决定删除平方根,而不是将此修改公式的结果与原始距离值的平方进行比较,即
    “其中((x1-x2)^2+(y1-y2)^2)>(5^2)”
  • 根据您的SQL/DBMS系统的不同,可以在自定义函数中实现公式,这将使SQL查询本身更高效(因为“预编译”,可能用更好的语言编写等),并缩短引用时间(尽管事件需要列出两次,如前所述)
  • 根据具体情况,还可以更改数据库模式和底层应用程序,使公式(或其部分)预先计算并编制索引,从而为DBMS节省基于函数谓词的冗长解析

25的值是动态的,我认为这将是答案,不幸的是,这不是我想要的答案。我使用的实际表达式是“大圆”。因此,这是一个相当大的计算/表达式。谢谢。@phxis:请参阅添加的关于where子句中公式问题的信息,以及抵消此责任的方法。