Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Doctrine2 DBAL Ada kueri

Terlambat beberapa tahun, tetapi Anda harus menentukan EXISTS subquery SQL dalam SELECT atau WHERE bagian pernyataan dari QueryBuilder, bukan menggunakan parameter.

Selain itu sejak order adalah kata yang dicadangkan di MySQL, Anda harus menggunakan tanda kutip pengenal ` (centang kembali) untuk keluar dari nama tabel.

Saat menggunakan ORM; anda harus menentukan FROM pernyataan yang mereferensikan suatu entitas, jadi Anda perlu mengubah pendekatan Anda.

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

SQL yang dihasilkan

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

Namun, saya sarankan untuk mengubah kueri Anda dari gabungan pengecualian menjadi gabungan penyertaan dengan NOT EXISTS . Melakukannya akan memfilter pesanan yang telah dibayar, dari hasil yang Anda tetapkan. Alih-alih mencoba menggabungkan setiap pesanan pada setiap pembayaran dan mengambil pembayaran yang mengembalikan null . Meningkatkan kinerja kueri secara dramatis.

Contoh 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. Beberapa GROUP_CONCAT di berbagai bidang menggunakan MySQL

  2. Mengelompokkan tabel dalam database MySQL

  3. Masalah Java + Mysql UTF8

  4. Di PHP/MySQL haruskah saya membuka beberapa koneksi database atau berbagi 1?

  5. Setel semua kolom tabel mysql ke nilai tertentu