簡単なクエリがあります:
SELECT u_name AS user_name FROM users WHERE user_name = "john";
私は得るUnknown Column 'user_name' in where clause
。'user_name'
の後で、ステートメントの他の部分を参照することはできませんselect 'u_name as user_name'
か?
簡単なクエリがあります:
SELECT u_name AS user_name FROM users WHERE user_name = "john";
私は得るUnknown Column 'user_name' in where clause
。'user_name'
の後で、ステートメントの他の部分を参照することはできませんselect 'u_name as user_name'
か?
SQL は、右から左に逆方向に評価されます。そのため、where 句は解析され、select 句の前に評価されます。このため、u_name から user_name へのエイリアスはまだ発生していません。
どうですか:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
次の MySQL マニュアル ページを参照してください: http://dev.mysql.com/doc/refman/5.0/en/select.html
「select_expr には AS alias_name を使用してエイリアスを指定できます。エイリアスは式の列名として使用され、GROUP BY、ORDER BY、または HAVING 句で使用できます。」
(...)
WHERE 句の実行時に列の値がまだ決定されていない可能性があるため、WHERE 句で列のエイリアスを参照することはできません。セクションB.5.4.4「列エイリアスの問題」を参照してください。
select u_name as user_name from users where u_name = "john";
次のように考えてください。where 句が最初に評価され、どの行 (または結合された行) を返す必要があるかが判断されます。where句が実行されると、select句が実行されます。
より良い言い方をすれば、次のように想像してください。
select distinct(u_name) as user_name from users where u_name = "john";
後半なしで前半を参照することはできません。Where は常に最初に評価され、次に select 句が評価されます。
SELECTステートメントを使用してデータベースに実際には存在しない新しいフィールドを作成し、次のようなクエリを実行しようとしている場合(少なくとも1つの添付ファイルがあるすべてのノードを検索)、その結果のエイリアスは、同じ問題に遭遇します。
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
「WHERE句の不明な列'attachmentcount'」というエラーが表示されます。
解決策は実際にはかなり単純です。エイリアスを、エイリアスを生成するステートメントに置き換えるだけです。例:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;
引き続きエイリアスが返されますが、SQLが不明なエイリアスで失敗することはありません。
あなたの定義は、このために句を使用しなければならalias
ない句によって歓迎されていませんWHERE
HAVING
SELECT u_name AS user_name FROM users HAVING user_name = "john";
または、元の列名を直接使用できますWHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
サブクエリまたは計算の結果としてユーザー定義のエイリアスに結果があるのと同じように、それはHAVING
句ではなく句によってアクセスされますWHERE
SELECT u_name AS user_name ,
(SELECT last_name FROM users2 WHERE id=users.id) as user_last_name
FROM users WHERE u_name = "john" HAVING user_last_name ='smith'
また:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
また:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
RDBMS がインライン ビューへの述語のプッシュをサポートしている場合、後者は前者と同じである必要があります。
訂正:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
いいえ、正しい名前で選択する必要があります。エイリアスから選択したテーブルを指定した場合は、それを使用できます。
いいえ、あなたがすることはできません。user_name は返却時間まで存在しません。
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
役立つかもしれません。
あなたはできる
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
できます。
しかし、あなたが何をするかを確認してください!
しかし、場合によっては役立つかもしれません
WHERE
行 1 および 2 によって発生し、行 3 によって解決された句の不明な列:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
この問題が発生しました。
データベース内のエンティティの名前にスペースが含まれていないことを確認してください。
例: 「user_name」の代わりに「user_name」
クエリ内でテーブルに別名を付けることができますが (つまり、「SELECT u.username FROM users u;」)、参照している列の実際の名前を使用する必要があります。AS は、フィールドが返される方法にのみ影響します。
私は同じ問題を抱えていましたが、これは便利だと思いました。
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
$user を ' ' 一重引用符で囲むことを忘れないでください。