Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Doctrine2 DBAL Tồn tại truy vấn

Chậm một vài năm, nhưng bạn cần chỉ định EXISTS của mình truy vấn con SQL trong SELECT hoặc WHERE phần câu lệnh của QueryBuilder, trái ngược với việc sử dụng một tham số.

Ngoài ra kể từ order là một từ dành riêng trong MySQL, bạn sẽ cần sử dụng dấu ngoặc kép ` (đánh dấu lùi) để thoát khỏi tên bảng.

Khi sử dụng ORM; bạn phải chỉ định một FROM tuyên bố tham chiếu đến một thực thể, vì vậy bạn cần phải thay đổi cách tiếp cận của mình.

$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 kết quả

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

Tuy nhiên, tôi khuyên bạn nên thay đổi truy vấn của mình từ một phép nối loại trừ thành một phép nối bao gồm với NOT EXISTS . Làm như vậy sẽ lọc các đơn đặt hàng đã được thanh toán ra khỏi tập hợp kết quả của bạn. Thay vì cố gắng tham gia mọi đơn hàng trên mọi khoản thanh toán và truy xuất các khoản thanh toán trả về null . Cải thiện đáng kể hiệu suất của truy vấn.

Ví dụ 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. Ngoại lệ trong luồng chính java.lang.Incomp Tương thíchClassChangeError:Đã tìm thấy giao diện org.apache.hadoop.mapreduce.JobContext, nhưng lớp được mong đợi?

  2. Chọn phạm vi ngày MySQL với date_format

  3. MySQL JOIN với SUM và 3 bảng

  4. Làm cách nào để lấy tên tất cả các cột cho tất cả các bảng trong MySQL?

  5. Truy vấn lựa chọn tùy chỉnh cho bảng meta