【问题标题】:Converting a SQL Statement with Subqueries使用子查询转换 SQL 语句
【发布时间】:2013-02-09 14:49:11
【问题描述】:

我正在使用 Zend Framework 开发一个网站。后端数据库是 MySQL。当我将以下 SQL 复制并粘贴到 phpMyAdmin 时,它的执行没有任何错误。但是,我无法将这种带有多个子查询的 SQL 转换为可以在 Zend Framework 之上运行。

update 
    tb_data_proposal_crpf_reviewer
set
    is_commented = 0
where
    id IN (
    select 
        t.id
    from
        (
        select
            r.id as id
        from
            tb_data_proposal_crpf_reviewer r
            left join tb_data_panel_member m on m.id = r.panel_member_id
        where
            r.proposal_crpf_id = :crpf_id and
            r.is_commented = 1 and
            m.panel_code IN (
                select
                    distinct(s.panel_code)
                from
                    tb_data_proposal_crpf_stage s
                where
                    s.proposal_crpf_id = :crpf_id and
                    s.crp_stage_code = 1
            )
        ) as t
)

【问题讨论】:

标签: php zend-framework


【解决方案1】:

在这里查看 Mindlock 的答案,它使用子查询对我有用,希望它对你也有帮助

zend-framework-zend-db-select-how-to-join-custom-subquery-table

【讨论】:

    【解决方案2】:

    如果第一个查询与第二个查询给出相同的结果,您可以拆分逻辑以首先加载所有受影响的 id,然后通过通常的 Zend 方法对其进行更新。

    很遗憾,我无法验证第一个查询。

    第一:

    select
      distinct(r.id) as id
    from
      tb_data_proposal_crpf_reviewer AS r
      left join tb_data_panel_member AS m
        on
          m.id = r.panel_member_id
            and
          m.panel_code = r.panel_code
    where
      r.proposal_crpf_id = :crpf_id
        and
      r.is_commented = 1
        and
      r.crp_stage_code = 1
    

    秒:

    select
        r.id as id
    from
        tb_data_proposal_crpf_reviewer r
        left join tb_data_panel_member m on m.id = r.panel_member_id
    where
        r.proposal_crpf_id = :crpf_id and
        r.is_commented = 1 and
        m.panel_code IN (
            select
                distinct(s.panel_code)
            from
                tb_data_proposal_crpf_stage s
            where
                s.proposal_crpf_id = :crpf_id and
                s.crp_stage_code = 1
        )
    ) as t
    

    【讨论】:

      【解决方案3】:

      所有子查询都需要有别名,因此请尝试更新:

          where
              s.proposal_crpf_id = :crpf_id and
              s.crp_stage_code = 1
      )
      

          where
              s.proposal_crpf_id = :crpf_id and
              s.crp_stage_code = 1
      ) as u
        ^^^^
      

      【讨论】:

        猜你喜欢
        • 2023-03-30
        • 1970-01-01
        • 2017-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多