sql >> Databasteknik >  >> RDS >> Mysql

Doctrine2 DBAL Exists-fråga

Några år försenat, men du måste ange din EXISTS subquery SQL inom SELECT eller WHERE satsdelen av QueryBuilder, i motsats till att använda en parameter.

Dessutom sedan order är ett reserverat ord i MySQL, måste du använda identifierande citattecken ` (back-tick) för att undvika tabellnamnet.

När du använder ORM; du måste ange en FROM uttalande som refererar till en enhet, så du skulle behöva ändra ditt tillvägagångssätt.

$connection = $this->em->getConnection();
$expr = $connection->getExpressionBuilder();
$qbSub = $connection->createQueryBuilder()
    ->select(['1'])
    ->from('`order`', 'o')
    ->leftJoin('o', '`payment`', 'p', $exor->eq('p.order_id', 'o.id'))
    ->where($expr->isNull('p.id'));

/**
 * @return string "1" if a record exists, "0" otherwise
 */
$connection->createQueryBuilder()
    ->select('EXISTS(' . $qbSub->getSQL() . ')')
    ->execute()
    ->fetchColumn();
$qb
    ->setParameter('name', $value)
    ->execute();

Resulterande SQL

SELECT EXISTS(
   SELECT 1
   FROM `order` AS o
   LEFT JOIN `payment` AS p
   ON p.order_id = o.id
   WHERE p.id IS NULL
);

Jag föreslår dock att du ändrar din fråga från en exkluderingsjoin till en inkluderingsjoin med NOT EXISTS . Om du gör det kommer beställningar som har betalats bort från din resultatuppsättning. Istället för att försöka gå med i varje beställning på varje betalning och hämta betalningarna som returnerar null . Dramatiskt förbättra prestandan för frågan.

Exempel db-fiddle

SELECT EXISTS (
    SELECT 1
    FROM `order` AS o2
    WHERE NOT EXISTS(
        SELECT NULL
        FROM `order` AS o
        INNER JOIN `payment` AS p
        ON p.order_id = o.id
        WHERE o2.id = o.id
    )
)



  1. Hur definierar man ett operatoralias i PostgreSQL?

  2. Fråga med GROUP BY och ORDER BY fungerar inte när flera kolumner i SELECT är valda

  3. Att kombinera SELECT DISTINCT med UNION DISTINCT i MySQL - någon effekt?

  4. Hur undkommer man kommatecken i CSV-värden när man importerar tabell till MySQL?