sql >> データベース >  >> RDS >> Mysql

Doctrine2DBALExistsクエリ

    数年遅れていますが、EXISTSを指定する必要があります SELECT内のSQLのサブクエリ またはWHERE パラメータを使用するのではなく、QueryBuilderのステートメント部分。

    さらに、order以降 MySQLで予約語である場合は、識別子の引用符`を使用する必要があります (バックティック)テーブル名をエスケープします。

    ORMを使用する場合。 FROMを指定する必要があります エンティティを参照するステートメントなので、アプローチを変更する必要があります。

    $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

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

    ただし、クエリを除外結合からNOT EXISTSを使用した包含結合に変更することをお勧めします 。そうすることで、結果セットから、支払われた注文がフィルタリングされます。すべての支払いですべての注文に参加し、nullを返す支払いを取得しようとする代わりに 。クエリのパフォーマンスが大幅に向上します。

    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. SQLAlchemy MySQL接続が常にスリープ状態になるのは奇妙ですか?

    2. PHP配列がmysqlデータでいっぱいにならない

    3. SQLデータベーステーブルのn番目の行を選択するにはどうすればよいですか?

    4. ORA-01027:if elseifを使用しようとすると、バインド変数をデータ定義に使用できません