0

私はこのMySQLクエリを機能させています(関連する行のみを表示するために削除されています):

SELECT
  c.id AS id_comment
, bl.id_user AS block
FROM comments AS c
LEFT JOIN user_blocked AS bl ON 
  (c.id_user = bl.id_user AND :uid = bl.id_user_blocked) 
  OR (c.id_user = bl.id_user_blocked AND :uid = bl.id_user)
WHERE (c.id_title = :idt)

できます!しかし、結果を取得したいblock IS NULLので、次の場所に新しい条件を追加しWHEREます。

SELECT
  c.id AS id_comment
, bl.id_user AS block
FROM comments AS c
LEFT JOIN user_blocked AS bl ON 
  (c.id_user = bl.id_user AND :uid = bl.id_user_blocked) 
  OR (c.id_user = bl.id_user_blocked AND :uid = bl.id_user)
WHERE (c.id_title = :idt) AND (block IS NULL)

しかし、私はこのエラーを受け取ります:

SQL ERROR: SQLSTATE[42S22]: Column not found: 1054
Unknown column 'block' in 'where clause'

なんで?私は何が間違っているのですか?

4

2 に答える 2

2

blockは、ALIAS代わりに列の名前を使用する必要があります

SELECT...
FROM...
WHERE (c.id_title = :idt) AND (bl.id_user IS NULL)

見つからない理由は、操作の順序が次のとおりであるためです。

  • FROM句
  • WHERE句
  • GROUPBY句
  • HAVING句
  • SELECT句
  • ORDERBY句

列名の代わりに使用する場合blockは、クエリ全体をに入れる必要がありますSubQuery。例えば

SELECT  * 
FROM
(
    SELECT  c.id AS id_comment, 
            bl.id_user AS block
    FROM    comments AS c
            LEFT JOIN user_blocked AS bl 
                ON  (c.id_user = bl.id_user AND :uid = bl.id_user_blocked) OR 
                (c.id_user = bl.id_user_blocked AND :uid = bl.id_user)
    WHERE   c.id_title = :idt
) s
WHERE block IS NULL

しかし、私はサブクエリを使用するよりも最初の解決策を好みます。

于 2012-12-31T02:16:34.413 に答える
2

列エイリアスを参照することはできません。代わりに、実際の列を参照してください。

WHERE (c.id_title = :idt) AND (bl.id_user IS NULL)
于 2012-12-31T02:16:56.150 に答える