Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Doctrine2 DBAL istnieje zapytanie

Kilka lat spóźnienia, ale musisz określić swoje EXISTS podzapytanie SQL w SELECT lub WHERE część instrukcji QueryBuilder, w przeciwieństwie do używania parametru.

Dodatkowo od order jest słowem zastrzeżonym w MySQL, musisz użyć cudzysłowów identyfikatora ` (wstecz), aby zmienić nazwę tabeli.

Podczas korzystania z ORM; musisz określić FROM oświadczenie, które odnosi się do podmiotu, więc musisz zmienić swoje podejście.

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

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

Sugeruję jednak zmianę zapytania ze sprzężenia wykluczającego na sprzężenie włączenia z NOT EXISTS . Spowoduje to odfiltrowanie opłaconych zamówień z zestawu wyników. Zamiast próbować dołączać do każdego zamówienia przy każdej płatności i pobierać płatności, które zwracają null . Znacząca poprawa wydajności zapytania.

Przykład 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak rozwiązać problem Nie można załadować wtyczki uwierzytelniającej „caching_sha2_password”

  2. Transponować wiersz do kolumn za pomocą MySQL bez używania UNIS?

  3. Połączenie z bazą danych nie zwalnia się po upływie czasu bezczynności w Glassfish

  4. SQLSTATE[23000]:Naruszenie ograniczenia integralności:1217

  5. Policzyć duplikaty rekordów w tabeli Mysql?