ホームページ >データベース >mysql チュートリアル >MySQL の WHERE 句で列エイリアスを使用できないのはなぜですか?
#1054 - Unknown column 'guaranteed_postcode' in 'IN/ALL/ANY subquery'
のような MySQL クエリ エラーが発生しましたか? これは通常、guaranteed_postcode
句内で列のエイリアス (以下の例の WHERE
など) を使用しようとしたときに発生します。
<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE `guaranteed_postcode` NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>根本的な原因は? MySQL の
句は、エイリアスが定義されている WHERE
句の前を処理します。 したがって、エイリアス SELECT
は、guaranteed_postcode
句の実行中にまだ認識されません。WHERE
句では列のエイリアスが許可されないことが明確に記載されています。 これはクエリの実行順序に起因する制限です。WHERE
SUBSTRING
句のサブクエリ内に直接埋め込みます:WHERE
<code class="language-sql">SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`, SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode` FROM `users` LEFT OUTER JOIN `locations` ON `users`.`id` = `locations`.`user_id` WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN ( SELECT `postcode` FROM `postcodes` WHERE `region` IN ('australia') )</code>
HAVING
は、基本的な行フィルタリングではなく、HAVING
集計後のフィルタリングを目的として設計されています。 クエリを再構築する必要があります。 詳細な説明については、 と WHERE
を比較する他のリソースを参照してください。HAVING
句のスコープ内でエイリアス計算を適用することで、この問題に直接対処します。 集計を実行する場合を除き、WHERE
の使用は避けてください。HAVING
以上がMySQL の WHERE 句で列エイリアスを使用できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。