【发布时间】:2019-02-12 09:23:14
【问题描述】:
我正在将 Mysql SQL 迁移到 Symfony 项目,当我执行 SQL 时,我收到了来自 TLP 的错误。我猜问题出在 WHERE 子句中的第二个 SELECT 中。
如果我使用原始 SQL,并且没有使用 symfony 框架,我没有问题。此外,如果我将 WHERE 子句与 "(vars.ns IN (SELECT...))" 一起使用,我不会收到任何错误,但 SQL 不能这样。
date_default_timezone_set('UTC');
$em = $this->getContainer()->get('doctrine')->getManager();
$query = $em->createQuery("SELECT vars.dm, vars.ns, vars.mc, vars.ac, vars.sf, vars.cn, vars.mp, vars.ta, vars.mo, vars.mh, vars.pa, vars.sp, vars.so, vars.sh, vars.sn, vars.mm, vars.ms, vars.gs, vars.a1, vars.a2, vars.updated FROM BaseBundle:Vars vars WHERE (SELECT device.id FROM BaseBundle:Device device WHERE device.ns = vars.ns AND device.idUser IS NOT NULL AND device.idUser != '422' AND device.idUser != '819') AND vars.idDevice IS NOT NULL AND vars.updated > :time")->setParameter('time', date('Y-m-d H:i:s', strtotime('-31 days')));
$historics = $query->getResult();
我得到这个错误:
[Doctrine\ORM\Query\QueryException]
[Syntax Error] line 0, col 233: Error: Expected Literal, got 'SELECT'
这个 SQL 必须返回 276 行,它确实返回了,但不是在 symfony 中。对这个问题有任何想法吗? 非常感谢,
更新: MYSQL 原始查询
SELECT
vars.dm,
vars.ns,
vars.mc,
vars.ac,
vars.sf,
vars.cn,
vars.mp,
vars.ta,
vars.mo,
vars.mh,
vars.pa,
vars.sp,
vars.so,
vars.sh,
vars.sn,
vars.mm,
vars.ms,
vars.gs,
vars.a1,
vars.a2,
vars.updated
FROM
table_3.vars
WHERE
(SELECT
device.id_user
FROM
table_3.device
WHERE
device.ns = vars.ns
AND device.id_user IS NOT NULL
AND device.id_user != '422'
AND device.id_user != '819')
AND vars.id_device IS NOT NULL
AND vars.updated > NOW() - INTERVAL 30 DAY
【问题讨论】:
-
你可能会错过像
WHERE vars.device_id IN (SELECT ...)这样的东西 -
我在您的查询中没有看到
IN语句,现在您的查询确实不正确 -
重点是我在 vars 表(vars.id)和设备表之间没有任何关系。所以,如果我使用 vars.id 结果是错误的。在 MYSQL 中没有它可以正常工作。我用 Mysql 查询更新
标签: mysql symfony doctrine where