sql >> Database teknologi >  >> RDS >> Mysql

Doctrine2 DBAL Eksisterer forespørgsel

Et par år forsinket, men du skal angive din EXISTS underforespørgsel SQL i SELECT eller WHERE sætningsdelen af ​​QueryBuilder, i modsætning til at bruge en parameter.

Derudover siden order er et reserveret ord i MySQL, skal du bruge identifikationsanførselstegn ` (Tilbagekryds) for at undslippe tabelnavnet.

Når du bruger ORM; du skal angive en FROM erklæring, der refererer til en enhed, så du bliver nødt til at ændre din tilgang.

$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();

Resulterende 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
);

Jeg foreslår dog, at du ændrer din forespørgsel fra en ekskluderings-join til en inclusion join med NOT EXISTS . Hvis du gør det, vil ordrer, der er blevet betalt, filtreres ud af dit resultatsæt. I stedet for at forsøge at slutte sig til hver ordre på hver betaling og hente de betalinger, der returnerer null . Dramatisk forbedring af forespørgslens ydeevne.

Eksempel 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. FEJL på linje 191:ORA-01489:resultatet af strengsammenkædning er for lang

  2. To autoincrements-kolonner eller autoincrement og samme værdi i anden kolonne

  3. ResultSet.getString(Date) er forskellig baseret på driver

  4. Indsættelse af SQL Server-data i Salesforce.com