私は簡単なクエリを持っています:
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は、右から左に逆向きに評価されます。したがって、select句の前にwhere句が解析および評価されます。このため、user_nameへのu_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";
前半を参照せずに前半を参照することはできません。常に最初に評価される場所、次に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 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がインラインビューへの述部プッシュをサポートする場合、後者は前者と同じである必要があります。
いいえ、正しい名前で選択する必要はありません。エイリアスから選択したテーブルを指定した場合は、それでも使用できます。
いいえ、あなたがすることはできません。 user_nameは、戻るまで存在しません。
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」
役に立つかもしれません。
あなたはできる
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
できます。
しかし、あなたが何をするかを確認してください!
しかし、場合によっては役立つかもしれません
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
クエリ内でテーブルのエイリアスを作成できます(つまり、「SELECT u.username FROM users u;」)が、参照している列の実際の名前を使用する必要があります。 ASは、フィールドが返される方法にのみ影響します。
MS-SQL 2000/5で知っている限りではありません。私は過去にこれに反則しました。
私は同じ問題を抱えていた、これは便利だと思った。
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
$ userを ''単一引用符で囲むことを忘れないでください。
IN conditionまたはまたは conditionを使用してタスクを試してください。また、このクエリはspark-1.6.xで動作しています。
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
または
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';