SubQuery in addSelect with Alias #6408

Closed
opened 2026-01-22 15:32:44 +01:00 by admin · 3 comments
Owner

Originally created by @ybenhssaien on GitHub (Feb 21, 2020).

Bug Report

Q A
BC Break yes
Version 2.7

Summary

Creating a subquery in addSelect with alias, generates syntax error while it shouldn't
image

Current behavior

Working with QueryBuilder to construct a parent query with subqueries in columns :

  • The first case : subqueries with alias (not working)
        $qb = $this->getMissionQueryBuilder()->select('DISTINCT m.cmi');

        foreach (MissionHelper::getTypeOfAssignementList() as $key => $typeOfAssignement) {
            $subQbAlias = 'sub_m_'.$key;

            $subQb = $this
                ->createQueryBuilder($subQbAlias)
                ->select('count('.$subQbAlias.')');

            $subQb
                ->where($subQbAlias.'.cmi = m.cmi')
                ->andWhere($subQb->expr()->like(
                    $subQbAlias.'.typeOfAssignement',
                    $qb->expr()->literal($typeOfAssignement)
                ));

            $qb->addSelect(sprintf(
                '(%1s) AS %2s',
                $subQb->getQuery()->getDQL(),
                $subQb->expr()->literal($typeOfAssignement)
            ));
        }

        return $qb->getQuery()->getResult();
  • The second case : subqueries without alias (working)
        $qb = $this->getMissionQueryBuilder()->select('DISTINCT m.cmi');

        foreach (MissionHelper::getTypeOfAssignementList() as $key => $typeOfAssignement) {
            $subQbAlias = 'sub_m_'.$key;

            $subQb = $this
                ->createQueryBuilder($subQbAlias)
                ->select('count('.$subQbAlias.')');

            $subQb
                ->where($subQbAlias.'.cmi = m.cmi')
                ->andWhere($subQb->expr()->like(
                    $subQbAlias.'.typeOfAssignement',
                    $qb->expr()->literal($typeOfAssignement)
                ));

            $qb->addSelect(sprintf(
                '(%1s)',
                $subQb->getQuery()->getDQL()
            ));
        }

        return $qb->getQuery()->getResult();

Look at Excepted Behavior for examples

How to reproduce

Create subqueries in select columns with alias.

Expected behavior

  • Generated DQL with alias (not working) :
SELECT 
            DISTINCT m.cmi, 
    (SELECT count(sub_m_0) FROM App\Entity\Mission sub_m_0 WHERE sub_m_0.cmi = m.cmi AND sub_m_0.typeOfAssignement LIKE 'APPRENTI') AS 'APPRENTI', 
    (SELECT count(sub_m_1) FROM App\Entity\Mission sub_m_1 WHERE sub_m_1.cmi = m.cmi AND sub_m_1.typeOfAssignement LIKE 'DUAL') AS 'DUAL', 
    (SELECT count(sub_m_2) FROM App\Entity\Mission sub_m_2 WHERE sub_m_2.cmi = m.cmi AND sub_m_2.typeOfAssignement LIKE 'EXCEPTION') AS 'EXCEPTION', 
    (SELECT count(sub_m_3) FROM App\Entity\Mission sub_m_3 WHERE sub_m_3.cmi = m.cmi AND sub_m_3.typeOfAssignement LIKE 'HOME BASED') AS 'HOME BASED', 
    (SELECT count(sub_m_4) FROM App\Entity\Mission sub_m_4 WHERE sub_m_4.cmi = m.cmi AND sub_m_4.typeOfAssignement LIKE 'PERMANENT') AS 'PERMANENT', 
    (SELECT count(sub_m_5) FROM App\Entity\Mission sub_m_5 WHERE sub_m_5.cmi = m.cmi AND sub_m_5.typeOfAssignement LIKE 'SHORT TERM') AS 'SHORT TERM', 
    (SELECT count(sub_m_6) FROM App\Entity\Mission sub_m_6 WHERE sub_m_6.cmi = m.cmi AND sub_m_6.typeOfAssignement LIKE 'VIE') AS 'VIE' 
FROM App\Entity\Mission m
;
  • Generated DQL without Aliases (Working) :
SELECT 
            DISTINCT a0_.cmi AS cmi_0, 
    (SELECT count(a1_.id) AS sclr_2 FROM atea_mission a1_ WHERE a1_.cmi = a0_.cmi AND a1_.type_of_assignement LIKE 'APPRENTI') AS sclr_1, 
    (SELECT count(a2_.id) AS sclr_4 FROM atea_mission a2_ WHERE a2_.cmi = a0_.cmi AND a2_.type_of_assignement LIKE 'DUAL') AS sclr_3, 
    (SELECT count(a3_.id) AS sclr_6 FROM atea_mission a3_ WHERE a3_.cmi = a0_.cmi AND a3_.type_of_assignement LIKE 'EXCEPTION') AS sclr_5, 
    (SELECT count(a4_.id) AS sclr_8 FROM atea_mission a4_ WHERE a4_.cmi = a0_.cmi AND a4_.type_of_assignement LIKE 'HOME BASED') AS sclr_7, 
    (SELECT count(a5_.id) AS sclr_10 FROM atea_mission a5_ WHERE a5_.cmi = a0_.cmi AND a5_.type_of_assignement LIKE 'PERMANENT') AS sclr_9, 
    (SELECT count(a6_.id) AS sclr_12 FROM atea_mission a6_ WHERE a6_.cmi = a0_.cmi AND a6_.type_of_assignement LIKE 'SHORT TERM') AS sclr_11, 
    (SELECT count(a7_.id) AS sclr_14 FROM atea_mission a7_ WHERE a7_.cmi = a0_.cmi AND a7_.type_of_assignement LIKE 'VIE') AS sclr_13 
FROM atea_mission a0_ 
;
  • MySQL equivalent query ;
SELECT
            distinct cmi as CMI,
            (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'VIE' ) as 'VIE',
            (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'PERMANENT' ) as 'PERMANENT',
            (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'DUAL' ) as 'DUAL',
            (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'APPRENTI' ) as 'APPRENTI',
            (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'HOME BASED' ) as 'HOME BASED',
            (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'SHORT TERM' ) as 'SHORT TERM'
FROM atea_mission as mission
Originally created by @ybenhssaien on GitHub (Feb 21, 2020). ### Bug Report <!-- Fill in the relevant information below to help triage your issue. --> | Q | A |------------ | ------ | BC Break | yes | Version | 2.7 #### Summary Creating a subquery in addSelect with alias, generates syntax error while it shouldn't ![image](https://user-images.githubusercontent.com/7301643/75047550-386b4280-54c7-11ea-9065-bdbb58056e10.png) #### Current behavior Working with QueryBuilder to construct a parent query with subqueries in columns : - The first case : subqueries with alias (not working) ```php $qb = $this->getMissionQueryBuilder()->select('DISTINCT m.cmi'); foreach (MissionHelper::getTypeOfAssignementList() as $key => $typeOfAssignement) { $subQbAlias = 'sub_m_'.$key; $subQb = $this ->createQueryBuilder($subQbAlias) ->select('count('.$subQbAlias.')'); $subQb ->where($subQbAlias.'.cmi = m.cmi') ->andWhere($subQb->expr()->like( $subQbAlias.'.typeOfAssignement', $qb->expr()->literal($typeOfAssignement) )); $qb->addSelect(sprintf( '(%1s) AS %2s', $subQb->getQuery()->getDQL(), $subQb->expr()->literal($typeOfAssignement) )); } return $qb->getQuery()->getResult(); ``` - The second case : subqueries without alias (working) ```php $qb = $this->getMissionQueryBuilder()->select('DISTINCT m.cmi'); foreach (MissionHelper::getTypeOfAssignementList() as $key => $typeOfAssignement) { $subQbAlias = 'sub_m_'.$key; $subQb = $this ->createQueryBuilder($subQbAlias) ->select('count('.$subQbAlias.')'); $subQb ->where($subQbAlias.'.cmi = m.cmi') ->andWhere($subQb->expr()->like( $subQbAlias.'.typeOfAssignement', $qb->expr()->literal($typeOfAssignement) )); $qb->addSelect(sprintf( '(%1s)', $subQb->getQuery()->getDQL() )); } return $qb->getQuery()->getResult(); ``` > Look at Excepted Behavior for examples #### How to reproduce Create subqueries in select columns with alias. #### Expected behavior - Generated DQL with alias (not working) : ```mysql SELECT DISTINCT m.cmi, (SELECT count(sub_m_0) FROM App\Entity\Mission sub_m_0 WHERE sub_m_0.cmi = m.cmi AND sub_m_0.typeOfAssignement LIKE 'APPRENTI') AS 'APPRENTI', (SELECT count(sub_m_1) FROM App\Entity\Mission sub_m_1 WHERE sub_m_1.cmi = m.cmi AND sub_m_1.typeOfAssignement LIKE 'DUAL') AS 'DUAL', (SELECT count(sub_m_2) FROM App\Entity\Mission sub_m_2 WHERE sub_m_2.cmi = m.cmi AND sub_m_2.typeOfAssignement LIKE 'EXCEPTION') AS 'EXCEPTION', (SELECT count(sub_m_3) FROM App\Entity\Mission sub_m_3 WHERE sub_m_3.cmi = m.cmi AND sub_m_3.typeOfAssignement LIKE 'HOME BASED') AS 'HOME BASED', (SELECT count(sub_m_4) FROM App\Entity\Mission sub_m_4 WHERE sub_m_4.cmi = m.cmi AND sub_m_4.typeOfAssignement LIKE 'PERMANENT') AS 'PERMANENT', (SELECT count(sub_m_5) FROM App\Entity\Mission sub_m_5 WHERE sub_m_5.cmi = m.cmi AND sub_m_5.typeOfAssignement LIKE 'SHORT TERM') AS 'SHORT TERM', (SELECT count(sub_m_6) FROM App\Entity\Mission sub_m_6 WHERE sub_m_6.cmi = m.cmi AND sub_m_6.typeOfAssignement LIKE 'VIE') AS 'VIE' FROM App\Entity\Mission m ; ``` - Generated DQL without Aliases (Working) : ```mysql SELECT DISTINCT a0_.cmi AS cmi_0, (SELECT count(a1_.id) AS sclr_2 FROM atea_mission a1_ WHERE a1_.cmi = a0_.cmi AND a1_.type_of_assignement LIKE 'APPRENTI') AS sclr_1, (SELECT count(a2_.id) AS sclr_4 FROM atea_mission a2_ WHERE a2_.cmi = a0_.cmi AND a2_.type_of_assignement LIKE 'DUAL') AS sclr_3, (SELECT count(a3_.id) AS sclr_6 FROM atea_mission a3_ WHERE a3_.cmi = a0_.cmi AND a3_.type_of_assignement LIKE 'EXCEPTION') AS sclr_5, (SELECT count(a4_.id) AS sclr_8 FROM atea_mission a4_ WHERE a4_.cmi = a0_.cmi AND a4_.type_of_assignement LIKE 'HOME BASED') AS sclr_7, (SELECT count(a5_.id) AS sclr_10 FROM atea_mission a5_ WHERE a5_.cmi = a0_.cmi AND a5_.type_of_assignement LIKE 'PERMANENT') AS sclr_9, (SELECT count(a6_.id) AS sclr_12 FROM atea_mission a6_ WHERE a6_.cmi = a0_.cmi AND a6_.type_of_assignement LIKE 'SHORT TERM') AS sclr_11, (SELECT count(a7_.id) AS sclr_14 FROM atea_mission a7_ WHERE a7_.cmi = a0_.cmi AND a7_.type_of_assignement LIKE 'VIE') AS sclr_13 FROM atea_mission a0_ ; ``` - MySQL equivalent query ; ```mysql SELECT distinct cmi as CMI, (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'VIE' ) as 'VIE', (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'PERMANENT' ) as 'PERMANENT', (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'DUAL' ) as 'DUAL', (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'APPRENTI' ) as 'APPRENTI', (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'HOME BASED' ) as 'HOME BASED', (select count(id) from atea_mission as sub_mission where sub_mission.cmi = mission.cmi and type_of_assignement LIKE 'SHORT TERM' ) as 'SHORT TERM' FROM atea_mission as mission ```
admin closed this issue 2026-01-22 15:32:45 +01:00
Author
Owner

@ybenhssaien commented on GitHub (Feb 26, 2020):

Solution : without using$qb->expr()->literal(), only assert that all whitespace characters are replace by a non withespace character like _ using preg_replace or equivalent :

$qb->addSelect(sprintf(
            '(%1s) AS %2s',
            $subQb->getQuery()->getDQL(),
            preg_replace('/\s/', '_', $typeOfAssignement)
        ));
@ybenhssaien commented on GitHub (Feb 26, 2020): **Solution :** without using`$qb->expr()->literal()`, only assert that all whitespace characters are replace by a non withespace character like `_` using `preg_replace` or equivalent : ```php $qb->addSelect(sprintf( '(%1s) AS %2s', $subQb->getQuery()->getDQL(), preg_replace('/\s/', '_', $typeOfAssignement) )); ```
Author
Owner

@beberlei commented on GitHub (Mar 1, 2020):

Yes, the bug is that you used literal for the aliases, they are not literals.

@beberlei commented on GitHub (Mar 1, 2020): Yes, the bug is that you used literal for the aliases, they are not literals.
Author
Owner

@ybenhssaien commented on GitHub (Mar 2, 2020):

Even without literal is not working :

$qb = $this->getMissionQueryBuilder()->select('DISTINCT m.cmi');

        foreach (MissionHelper::getTypeOfAssignementList() as $key => $typeOfAssignement) {
            $subQbAlias = 'sub_m_'.$key;

            $subQb = $this
                ->createQueryBuilder($subQbAlias)
                ->select('count('.$subQbAlias.')');

            $subQb
                ->where($subQbAlias.'.cmi = m.cmi')
                ->andWhere($subQb->expr()->like(
                    $subQbAlias.'.typeOfAssignement',
                    $qb->expr()->literal($typeOfAssignement)
                ));

            $qb->addSelect(sprintf(
                '(%1s) AS %2s',
                $subQb->getQuery()->getDQL(),
                $typeOfAssignement
            ));
        }

        return $qb->getQuery()->getResult();

image

So it is a bug !

@ybenhssaien commented on GitHub (Mar 2, 2020): Even without literal is not working : ```php $qb = $this->getMissionQueryBuilder()->select('DISTINCT m.cmi'); foreach (MissionHelper::getTypeOfAssignementList() as $key => $typeOfAssignement) { $subQbAlias = 'sub_m_'.$key; $subQb = $this ->createQueryBuilder($subQbAlias) ->select('count('.$subQbAlias.')'); $subQb ->where($subQbAlias.'.cmi = m.cmi') ->andWhere($subQb->expr()->like( $subQbAlias.'.typeOfAssignement', $qb->expr()->literal($typeOfAssignement) )); $qb->addSelect(sprintf( '(%1s) AS %2s', $subQb->getQuery()->getDQL(), $typeOfAssignement )); } return $qb->getQuery()->getResult(); ``` ![image](https://user-images.githubusercontent.com/7301643/75695772-de2e6680-5caa-11ea-894f-b5d76b4e888d.png) So it is a bug !
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#6408