-2

ここ Stackoverflow で助けがあり、正しいクエリを取得しました。しかし、彼は PHP をまったく知らなかったので、それについても助けが必要です。

クエリと PHP は次のとおりです。

if($do_resync) {
    $sql = "
        with MY_VIEW as
        (
        SELECT
            room_user.*,
            user.username AS user_name,
            user.group_id AS group_id, USER.USER_ID
        FROM {$x7->dbprefix}room_users room_user
        INNER JOIN {$x7->dbprefix}users user ON
            user.id = room_user.user_id
        WHERE
            room_id IN ({$rooms})
        )
        SELECT COUNT(id) AS block FROM
            blocks AS B, MY_VIEW AS M
        WHERE
            B.user_id = M.user_id
        AND B.blocked_id = B.user_id
    ";
    $st = $db->prepare($sql);
    $st->execute(); (THIS IS LINE 230 that the error points at)
    $users = $st->fetchAll();
    $output['users'] = $users;
}

echo json_encode($output);

そして、ここに私が得るエラーがあります:

Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MY_VIEW as ( SELECT room_user.*, user.username AS user_name, u' at line 6' in pages/sync.php:230 Stack trace: #0 pages/sync.php(230): PDOStatement->execute() #1 index.php(50): require('/home/vol5_3/by...') #2 {main} thrown in pages/sync.php on line 230

編集:

SELECT COUNT(id) AS block FROM
    blocks AS B, 
(
    SELECT
        room_user.*,
        user.username AS user_name,
        user.group_id AS group_id, USER.USER_ID
    FROM {$x7->dbprefix}room_users room_user
    INNER JOIN {$x7->dbprefix}users user ON
        user.id = room_user.user_id
    WHERE
        room_id IN ({$rooms})
) AS M
WHERE
    B.user_id = M.user_id
AND B.blocked_id = B.user_id
4

2 に答える 2

0

MysqlはWITH句をサポートしていませんが、以下のように実行できます.クエリからデータセットを結合します

SELECT * FROM 
        (
        SELECT
            room_user.*,
            user.username AS user_name,
            user.group_id AS group_id, USER.USER_ID
        FROM {$x7->dbprefix}room_users room_user
        INNER JOIN {$x7->dbprefix}users user ON
            user.id = room_user.user_id
        WHERE
            room_id IN ({$rooms})
        ) AS M
JOIN (SELECT * FROM blocks ) AS B
ON (B.user_id = M.user_id)
WHERE B.blocked_id = B.user_id

編集

SELECT * FROM 
            (
            SELECT
                room_user.*,
                user.username AS user_name,
                user.group_id AS group_id, USER.USER_ID
            FROM {$x7->dbprefix}room_users room_user
            INNER JOIN {$x7->dbprefix}users user ON
                user.id = room_user.user_id
            WHERE
                room_id IN ({$rooms})
            ) AS M
    JOIN blocks  B
    ON (B.user_id = M.user_id)
    WHERE B.blocked_id = B.user_id

または、 on 部分で where 条件を移動します

    JOIN blocks  B
    ON (B.user_id = M.user_id AND B.blocked_id = B.user_id)
于 2013-11-13T18:55:02.980 に答える