web-dev-qa-db-ja.com

Where句の不明な列

私は簡単なクエリを持っています:

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'を参照できませんか?

108
Corpo

SQLは、右から左に逆向きに評価されます。したがって、select句の前にwhere句が解析および評価されます。このため、user_nameへのu_nameのエイリアスはまだ発生していません。

80
dacracot

どうですか:

SELECT u_name AS user_name FROM users HAVING user_name = "john";
35
Septimus

次の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「列エイリアスの問題」を参照してください。

33
Paul Dixon
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句。

12
Mark S.

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は未知のエイリアスを気にすることはありません。

10
Jon

定義した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'
7
M Khalid Junaid

修正済み:

SELECT u_name AS user_name FROM users WHERE u_name = 'john';
6
Steven A. Lowe

どちらか:

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がインラインビューへの述部プッシュをサポートする場合、後者は前者と同じである必要があります。

6
David Aldridge

いいえ、正しい名前で選択する必要はありません。エイリアスから選択したテーブルを指定した場合は、それでも使用できます。

いいえ、あなたがすることはできません。 user_nameは、戻るまで存在しません。

3
Jarrett Meyer

WHERE句の不明な列は、1行目と2行目で発生し、3行目で解決されます。

  1. $sql = "SELECT * FROM users WHERE username =".$userName;
  2. $sql = "SELECT * FROM users WHERE username =".$userName."";
  3. $sql = "SELECT * FROM users WHERE username ='".$userName."'";
2
oliyide

この問題が発生しました。

データベース内のエンティティの名前にスペースがないことを確認してください。

例えば「user_name」ではなく「user_name」

1
user3103155

役に立つかもしれません。

あなたはできる

SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";

できます。

しかし、あなたが何をするかを確認してください!

  • インデックスはここでは使用されません
  • 全表がスキャンされます-LIMIT 1の部分を指定していません
  • だから、-このクエリは巨大なテーブルでSLLLOOOOOOWになります。

しかし、場合によっては役立つかもしれません

1
F_S
SELECT user_name
FROM
(
SELECT name AS user_name
FROM   users
) AS test
WHERE  user_name = "john"
0
Foripepe

クエリ内でテーブルのエイリアスを作成できます(つまり、「SELECT u.username FROM users u;」)が、参照している列の実際の名前を使用する必要があります。 ASは、フィールドが返される方法にのみ影響します。

0
Blumer

MS-SQL 2000/5で知っている限りではありません。私は過去にこれに反則しました。

0
Cirieno

私は同じ問題を抱えていた、これは便利だと思った。

mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");

$ userを ''単一引用符で囲むことを忘れないでください。

0
devWaleed

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';
0
KARTHIKEYAN.A