140

簡単なクエリがあります:

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'か?

4

17 に答える 17

106

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

于 2008-09-30T15:41:00.060 に答える
57

どうですか:

SELECT u_name AS user_name FROM users HAVING user_name = "john";
于 2010-10-04T15:03:43.537 に答える
39

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

于 2008-09-30T15:44:29.707 に答える
13
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 句が評価されます。

于 2008-09-30T15:41:35.190 に答える
11

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が不明なエイリアスで失敗することはありません。

于 2011-05-26T11:04:29.073 に答える
9

あなたの定義は、このために句を使用しなければならaliasない句によって歓迎されていませんWHEREHAVING

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'
于 2013-07-30T17:28:09.993 に答える
7

また:

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

于 2008-09-30T15:41:33.833 に答える
6

訂正:

SELECT u_name AS user_name FROM users WHERE u_name = 'john';
于 2008-09-30T15:39:50.437 に答える
5

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

于 2008-09-30T15:38:50.267 に答える
2

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

于 2008-09-30T15:38:22.763 に答える
1
SELECT user_name
FROM
(
SELECT name AS user_name
FROM   users
) AS test
WHERE  user_name = "john"
于 2009-04-23T08:44:53.427 に答える
1

役立つかもしれません。

あなたはできる

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

できます。

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

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

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

于 2011-11-22T10:59:09.917 に答える
1

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."'";
于 2010-01-28T23:06:49.907 に答える
0

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

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

例: 「user_name」の代わりに「user_name」

于 2015-04-02T15:15:57.520 に答える
0

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

于 2008-09-30T15:41:37.530 に答える
-2

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

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

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

于 2013-01-05T10:05:54.597 に答える