Câu trả lời:
SQL được đánh giá ngược, từ phải sang trái. Vì vậy, mệnh đề where được phân tích cú pháp và đánh giá trước mệnh đề select. Do đó, việc đặt bí danh của u_name thành user_name vẫn chưa xảy ra.
Xem trang hướng dẫn sử dụng MySQL sau: http://dev.mysql.com/doc/refman/5.0/en/select.html
"Một select_expr có thể được cung cấp một bí danh bằng cách sử dụng AS alias_name. Bí danh được sử dụng làm tên cột của biểu thức và có thể được sử dụng trong các mệnh đề GROUP BY, ORDER BY hoặc HAVING."
(...)
Không được phép tham chiếu bí danh cột trong mệnh đề WHERE, vì giá trị cột có thể chưa được xác định khi mệnh đề WHERE được thực thi. Xem Phần B.5.4.4, Các vấn đề về mối quan hệ với Bí danh Cột.
select u_name as user_name from users where u_name = "john";
Hãy nghĩ về nó như thế này, mệnh đề where của bạn đánh giá đầu tiên, để xác định hàng nào (hoặc hàng đã nối) cần được trả về. Khi mệnh đề where được thực thi, mệnh đề select sẽ chạy cho nó.
Để nói một cách tốt hơn, hãy tưởng tượng điều này:
select distinct(u_name) as user_name from users where u_name = "john";
Bạn không thể tham khảo nửa đầu mà không có thứ hai. Trường hợp luôn được đánh giá đầu tiên, sau đó là mệnh đề chọn.
Nếu bạn đang cố thực hiện một truy vấn như sau (tìm tất cả các nút có ít nhất một tệp đính kèm) trong đó bạn đã sử dụng câu lệnh CHỌN để tạo trường mới không thực sự tồn tại trong cơ sở dữ liệu và thử sử dụng bí danh cho kết quả đó bạn sẽ gặp phải cùng một vấn đề:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
Bạn sẽ gặp lỗi "Cột không xác định 'tệp đính kèm' trong mệnh đề WHERE".
Giải pháp thực sự khá đơn giản - chỉ cần thay thế bí danh bằng câu lệnh tạo ra bí danh, ví dụ:
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;
Bạn vẫn sẽ nhận được bí danh được trả về, nhưng bây giờ SQL không nên sử dụng bí danh.
(
truy vấn của bạn trước khi (COUNT(*)
không được đóng ở bất cứ đâu.
Định nghĩa của bạn alias
không được hoan nghênh bởi WHERE
mệnh đề bạn phải sử dụng HAVING
mệnh đề cho điều này
SELECT u_name AS user_name FROM users HAVING user_name = "john";
HOẶC bạn có thể trực tiếp sử dụng tên cột ban đầu với WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
Giống như bạn có kết quả là bí danh do người dùng định nghĩa là kết quả của truy vấn con hoặc bất kỳ phép tính nào, nó sẽ được truy cập bởi HAVING
mệnh đề không phải bởiWHERE
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'
Hoặc:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
hoặc là:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
Cái sau phải giống như cái trước nếu RDBMS hỗ trợ biến vị ngữ đẩy vào khung nhìn nội tuyến.
đã sửa:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
Không, bạn cần phải chọn nó với tên chính xác. Nếu bạn đã cho bảng bạn chọn từ một bí danh, bạn có thể sử dụng bảng đó.
Không, bạn không thể. user_name không tồn tại cho đến thời gian trả về.
Cột không xác định trong WHERE
mệnh đề gây ra bởi dòng 1 và 2 và được giải quyết bằng dòng 3:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
Có thể là nó giúp.
Bạn có thể
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
Nó hoạt động.
NHƯNG KIẾM ĐƯỢC NHỮNG GÌ BẠN LÀM GÌ!
Nhưng, có thể nó giúp trong một số trường hợp
Trong khi bạn có thể đặt bí danh cho các bảng trong truy vấn của mình (ví dụ: "CHỌN u.username TỪ người dùng u;"), bạn phải sử dụng tên thật của các cột bạn đang tham chiếu. NHƯ chỉ tác động làm thế nào các lĩnh vực được trả lại.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Chỉ có vấn đề này.
Hãy chắc chắn rằng không có khoảng trắng trong tên của thực thể trong cơ sở dữ liệu.
ví dụ: 'user_name' thay vì 'user_name'
thử tác vụ của bạn bằng điều kiện IN hoặc điều kiện OR và truy vấn này cũng hoạt động trên spark-1.6.x
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
hoặc là
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
Tôi đã có cùng một vấn đề, tôi thấy điều này hữu ích.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
nhớ đặt $ user trong dấu ngoặc đơn ''.