Mysql 在select中尝试使用求和差异的子查询-原则2.6.4

Mysql 在select中尝试使用求和差异的子查询-原则2.6.4,mysql,symfony,orm,doctrine,Mysql,Symfony,Orm,Doctrine,我试图在symfony和Doctrine 2.6.4中进行一些查询 我的问题是,我试图在select中执行一些子查询。在Mysql中,它看起来像: SELECT COALESCE((SELECT SUM(bill.amount) FROM bill WHERE bill.bill__client_id = cl.id), 0) AS

我试图在symfony和Doctrine 2.6.4中进行一些查询

我的问题是,我试图在select中执行一些子查询。在Mysql中,它看起来像:

SELECT 
COALESCE((SELECT 
                SUM(bill.amount)
            FROM
                bill
            WHERE
                bill.bill__client_id = cl.id),
        0) AS `total_to_pay`,
COALESCE((SELECT 
                SUM(payement.price + payement.taxes)
            FROM
                payement
            WHERE
                payement.payement__client_id = cl.id),
        0) AS `total_already_pay`,
COALESCE((SELECT 
                SUM(bill.amount)
            FROM
                bill
            WHERE
                bill.bill__client_id = cl.id),
        0) - COALESCE((SELECT 
                SUM(payement.price + payement.taxes)
            FROM
                payement
            WHERE
                payement.payement__client_id = cl.id),
        0) AS `total_to_pay_today`
FROM
client AS cl
在哪里 cl.id=x

在理论上,我尝试了以下方法:

    $query = $this->createQueryBuilder('cl')
                ->addSelect('(SELECT SUM(bi.amount) FROM App\Entity\Bill bi WHERE bi.billClient = cl.id) AS total_to_pay')
                ->addSelect('(SELECT SUM(pa.amount) FROM App\Entity\Payments pa WHERE pa.payementClient = cl.id) AS total_already_pay')
                ->addSelect('(SELECT SUM(bii.amount) FROM App\Entity\Bill bii WHERE bii.billClient = cl.id)-(SELECT SUM(paa.price + paa.taxes) FROM App\Entity\Payments paa WHERE pa.payementClient = cl.id) as total_to_pay_today')
                ->where('cl.id = :client_id')
                ->setParameter('client_id', $id)
                ->getQuery()
                ->getSQL();
它将返回以下错误:

Error: Expected Doctrine\ORM\Query\Lexer::T_FROM, got '-'

谢谢你的回答

我认为应该使用联接而不是子选择:

        ->addSelect('SUM(bi.amount) as total_to_pay')
        ->addSelect('SUM(pa.amount) as total_already_pay')
        ->addSelect('SUM(bi.amount) - SUM(pa.price + pa.taxes) as total_to_pay_today')
        ->where('cl.id = :client_id')
        ->leftJoin('App\Entity\Bill', 'bi', 'WITH', 'bi.billClient = cl.id')
        ->leftJoin('App\Entity\Payments', 'pa', 'WITH', 'pa.payementClient = cl.id')
        ->groupBy('cl.id')

问题不在于条令,而在于你的子查询。您不能添加/删除不同查询的etc结果,您可以通过尝试获取以下结果进行检查: 从id=1的用户中选择3-从id=1的用户中选择2; 非常相似的错误:

[42000][1064] You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '- (SELECT 2 FROM users WHERE id = 1)' at line 1