0

私は次のmysqlクエリを持っています

SELECT
    *
FROM
(
    SELECT
        CASE WHEN t2.user1=1 THEN t2.user2 ELSE t2.user1 END AS userId
    FROM
        t AS t2
    WHERE 1 IN (t2.user1,t2.user2)
    AND t2.[status]=1
) as tbl
WHERE EXISTS 
(
    SELECT
        NULL
    FROM
        t
    WHERE 2 IN (t.user1,t.user2)
    AND tbl.userId=(CASE WHEN t.user1=2 THEN t.user2 ELSE t.user1 END)
    AND t.[status]=1
)

正常に動作しますが、Doctrine2クエリに変換できません。

どのようにアイデアはありますか?

http://sqlfiddle.com/#!2/4c792/11

[編集]ネイティブSQLを使用してクエリを実行しました。

$rsm = new ResultSetMapping();
$rsm->addEntityResult('myProject\DataBundle\Entity\Friend', 'f');

    $sql= '
    SELECT
             *
        FROM (
            SELECT 
                CASE WHEN t2.user1=2 THEN t2.user2 ELSE t2.user1 END AS userId
            FROM friends AS t2 
            WHERE 2 IN (t2.user1,t2.user2) 
            AND t2.status=1 
        ) as tbl 
        WHERE EXISTS (
        SELECT 
            NULL 
        FROM 
            friends as t
        WHERE 3 IN (t.user1,t.user2) 
        AND tbl.userId=(CASE WHEN t.user1=3 THEN t.user2 ELSE t.user1_id END) 
        AND t.isFriendOrFollower=1 )';

    $query = $this->getEntityManager()
        ->createNativeQuery($sql,$rsm);

ただし、結果は表示されません。

4

1 に答える 1

0

dbal を使用してこれを行う簡単な方法を見つけました。

1: 接続を取得する必要があります

$conn=$this->container->get('database_connection');

2: クエリを書く

$sql= '
    SELECT
             *
        FROM (
            SELECT 
                CASE WHEN t2.user1=2 THEN t2.user2 ELSE t2.user1 END AS userId
            FROM friends AS t2 
            WHERE 2 IN (t2.user1,t2.user2) 
            AND t2.status=1 
        ) as tbl 
        WHERE EXISTS (
        SELECT 
            NULL 
        FROM 
            friends as t
        WHERE 3 IN (t.user1,t.user2) 
        AND tbl.userId=(CASE WHEN t.user1=3 THEN t.user2 ELSE t.user1_id END) 
        AND t.isFriendOrFollower=1 )';

3: クエリを実行します。

$rows = $conn->fetchAll($sql);

完了、問題は解決しました。

于 2013-02-19T04:26:50.220 に答える