【问题标题】:Codeigniter WHERE on "AS" field“AS”字段上的 Codeigniter WHERE
【发布时间】:2023-03-05 02:01:01
【问题描述】:

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

SELECT table_id, radians(25) AS rad FROM test_table WHERE rad

挂起的地方是“rad db->query(...)),但即使这样也不会让我这样做。我需要根据这个字段限制我的结果。哦,如果我删除 WHERE 过滤器,则 ORDER BY 效果很好。结果是按 rad 字段排序的 ASC。

求助!!!

【问题讨论】:

    标签: activerecord codeigniter where-clause


    【解决方案1】:

    对于许多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 过滤掉[大量] 否则会被处理的记录,情况就不会那么糟糕了。此类附加搜索条件可能由应用程序驱动(例如,除了辐射条件,该位置的 [不相关] 高度必须低于 6,000 英尺),或者可以“人为”添加此类条件以帮助查询(例如,您可能知道一个粗略的启发式方法,它不足以在可接受的精度内计算“弧度”值,但可能足以过滤掉 70% 的记录,只保留那些有机会满足“弧度”所需的确切范围。

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

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

    【讨论】:

    • 25 的值是动态的,我认为这将是答案,不幸的是不是我正在寻找的答案。我使用的实际表达是“大圆圈”。所以这是一个相当大的计算/表达式。谢谢。
    • @phxis:请参阅有关在 where 子句中使用公式的问题以及抵消此责任的方法的附加信息。
    猜你喜欢
    • 2018-05-31
    • 2013-03-10
    • 1970-01-01
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多