• ADADADADAD

    MySQL UDF 在 in ( subquery where ) bug[ mysql数据库 ]

    mysql数据库 时间:2024-12-24 19:11:21

    作者:文/会员上传

    简介:

    SELECT45,COUNT(0)FROMac_dealer_salesdsWHEREds.user_idin(SELECTdu.user_idFROMac_dept_userduWHEREdu.is_main=1ANDfun_get_team_id(du.dept_id)=23)这个sql 期望的返回

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    SELECT45,COUNT(0)
    FROMac_dealer_salesds
    WHEREds.user_idin(SELECTdu.user_idFROMac_dept_userdu
    WHEREdu.is_main=1ANDfun_get_team_id(du.dept_id)=23)

    这个sql 期望的返回值 是 5000.

    但是实际执行的返回值 是 8000.

    把这个sql 拆为 一个 select count(*) from tab where id in ( selectd id from tab).

    tab = ( create table tab as ( subquery) )

    sub query 中 包含了 一个UDF fun_get_team_id( int) return int

    结果与期望结果是一直的.

    测试了4个版本。5.5.95.6.325.7.268.0.19发现这样的语句只有在5.5.9上是正确的

    如果 UDF 在 selectd * from tab where idin ( select * from tab where UDF() .... )

    这种形式的 sql 语句中.mysql 执行计划 忽略了 UDF 的存在. 导致结果不准确.

    将 语句改写为一个 tab 与一个 subquery 关联 的写法. 结果是正确的.

    SELECTCOUNT(1)
    FROMac_dealer_salesa,(SELECTdu.user_idFROMac_dept_userdu
    WHEREdu.is_main=1ANDfun_get_team_id(du.dept_id)=23)b
    WHEREa.user_id=b.user_id

    这种情况下, 在 4个版本的 mysql 中都可以执行.但是 在5.6.325.7.26执行起来很慢 5.5.9跟8.19相对较快

    UDF 单独 在 select 部分, 还是 在 where 部分 都没有问题.

    跟 UDF 本身的实现逻辑没有关系.但是在 IN ( ) 子句中 执行计划 则忽略了 UDF 的过滤条件.

    MySQL UDF 在 in ( subquery where ) bug.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysqlbugudf