【问题标题】:Subquery in CakePhp with InnerJoinCakePhp 中的子查询与 InnerJoin
【发布时间】:2022-01-03 17:15:07
【问题描述】:

我正在尝试转换此查询:

SELECT
    pdd.pedinte_id, pdd.data, pdd.situacao as Situacao, pdd.valor_total, pdd.qtd_etiquetas, 
    (
        SELECT count(pdi.envio_id)
        FROM pedinte_item pdi
        INNER JOIN envios env ON
            pdi.envio_id = env.envio_id
        WHERE
            pdi.pedinte_id = pdd.pedinte_id AND
            env.Situacao = 2
    ) AS TemErros
FROM pedinte pdd
left join user usr on
    usr.user_id = pdd.user_id
WHERE pdd.user_id IS NOT NULL AND pdd.pedinte_id IS NOT NULL;

到 CakePhp:

removed code, maybe very wrong.

没有成功。

我有 4 张桌子:

  • pedinte (pdd)
  • pedinte_item (pdi)
  • envios (env)
  • user (usr)

pedinte > pedinte_item > envios (count)

不敢相信,查询生成器比 mysql 代码更难。

【问题讨论】:

  • 建议数据库设计错误。子查询永远都不好。也许解决这个问题?不确定我是否完全理解该查询。也许添加一个字段来存储聚合?如果您不能将其扭曲为 Cake,请使用原始 SQL 和映射器或 MySQL 视图?
  • 我做到了,原始 mysql 并重新创建了分页系统。
  • 慰问。框架试图让事情变得更容易。但相反,它们只是强迫你学习两种语言并处理每种语言的不完整性。

标签: php mysql cakephp query-builder cakephp-3.x


【解决方案1】:

(这并没有解决 CakePHP 的问题,但评论太长了)

(子查询并不总是“坏的”。)

这些索引可能有助于提高性能:

usr:  INDEX(user_id)
pdi:  INDEX(pedinte_id, envio_id)
env:  INDEX(Situacao, envio_id)

添加复合索引时,删除具有相同前导列的索引。 也就是说,当你同时拥有 INDEX(a) 和 INDEX(a,b) 时,就扔掉前者。

【讨论】:

    猜你喜欢
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多