回答:
SQLは、右から左に逆方向に評価されます。そのため、where句は、select句の前に解析および評価されます。このため、u_nameからuser_nameへのエイリアスはまだ発生していません。
何について:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
HAVING
代わりになぜ使用するのWHERE
ですか?
次の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「列エイリアスの問題」を参照してください。
次のようなクエリを実行しようとしている場合(少なくとも1つのアタッチメントを持つすべてのノードを検索)、SELECTステートメントを使用して、実際にはデータベースに存在しない新しいフィールドを作成し、その結果のエイリアスで同じ問題が発生します。
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
「不明な列 'attachmentcount' in WHERE句」というエラーが表示されます。
解決策は実際にはかなり単純です-エイリアスをエイリアスを生成するステートメントに置き換えるだけです。例:
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は不明なエイリアスを処理しません。
(
あなたのクエリの前に余分な(COUNT(*)
ものがあり、それがどこでも閉じられていないと信じています。
あなたの定義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は、返却時まで存在しません。
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."'";
クエリ内でテーブルにエイリアスを設定することはできますが(つまり、「SELECT u.username FROM users u;」)、参照している列の実際の名前を使用する必要があります。ASは、フィールドが返される方法にのみ影響します。
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
ちょうどこの問題がありました。
データベース内のエンティティーの名前にスペースがないことを確認してください。
例:「user_name」の代わりに「user_name」
IN条件またはOR条件を使用してタスクを試してください。また、このクエリは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';
同じ問題がありましたが、これは役に立ちました。
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
$ userを ''単一引用符で囲むことを忘れないでください。