Jawaban:
SQL dievaluasi mundur, dari kanan ke kiri. Jadi klausa where diurai dan dievaluasi sebelum klausa pilih. Karena itu, aliasing u_name ke user_name belum terjadi.
Lihat halaman manual MySQL berikut ini: http://dev.mysql.com/doc/refman/5.0/en/select.html
"Sebuah select_expr dapat diberi alias menggunakan AS alias_name. Alias tersebut digunakan sebagai nama kolom ekspresi dan dapat digunakan dalam klausa GROUP BY, ORDER BY, atau HAVING."
(...)
Tidak diizinkan untuk merujuk ke alias kolom dalam klausa WHERE, karena nilai kolom mungkin belum ditentukan saat klausa WHERE dijalankan. Lihat Bagian B.5.4.4, “Masalah dengan Alias Kolom”.
select u_name as user_name from users where u_name = "john";
Anggap saja seperti ini, klausa where Anda mengevaluasi terlebih dahulu, untuk menentukan baris mana (atau baris gabungan) yang perlu dikembalikan. Setelah klausa where dijalankan, klausa pemilihan berjalan untuknya.
Sederhananya, bayangkan ini:
select distinct(u_name) as user_name from users where u_name = "john";
Anda tidak dapat mereferensikan paruh pertama tanpa yang kedua. Di mana selalu dievaluasi terlebih dahulu, lalu klausa pilih.
Jika Anda mencoba melakukan kueri seperti berikut (temukan semua node dengan setidaknya satu lampiran) di mana Anda telah menggunakan pernyataan SELECT untuk membuat bidang baru yang sebenarnya tidak ada dalam database, dan coba gunakan alias untuk hasil itu Anda akan mengalami masalah yang sama:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
Anda akan mendapatkan error "Kolom tidak diketahui 'attachmentcount' di klausa WHERE".
Solusi sebenarnya cukup sederhana - cukup ganti alias dengan pernyataan yang menghasilkan alias, misalnya:
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;
Anda masih akan mendapatkan alias kembali, tetapi sekarang SQL tidak boleh mengganggu alias tidak dikenal.
(
dalam kueri Anda sebelum (COUNT(*)
yang tidak ditutup di mana pun.
Definisi Anda alias
tidak disambut oleh WHERE
klausa Anda harus menggunakan HAVING
klausa untuk ini
SELECT u_name AS user_name FROM users HAVING user_name = "john";
ATAU Anda bisa langsung menggunakan nama kolom asli dengan WHERE
SELECT u_name AS user_name FROM users WHERE u_name = "john";
Sama seperti Anda memiliki hasil dalam alias yang ditentukan pengguna sebagai hasil dari subquery atau perhitungan apa pun, itu akan diakses oleh HAVING
klausa bukan olehWHERE
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'
Antara:
SELECT u_name AS user_name
FROM users
WHERE u_name = "john";
atau:
SELECT user_name
from
(
SELECT u_name AS user_name
FROM users
)
WHERE u_name = "john";
Yang terakhir harus sama dengan yang pertama jika RDBMS mendukung dorongan predikat ke dalam tampilan in-line.
dikoreksi:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
Tidak, Anda perlu memilihnya dengan nama yang benar. Jika Anda memberikan tabel yang Anda pilih dari alias, Anda dapat menggunakannya.
Tidak Anda tidak bisa. user_name tidak ada sampai waktu kembali.
Kolom tidak diketahui dalam WHERE
klausa yang disebabkan oleh baris 1 dan 2 dan diselesaikan oleh baris 3:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
Mungkin bisa membantu.
Kamu bisa
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
Berhasil.
TAPI PASTIKAN APA YANG ANDA LAKUKAN!
Tapi, mungkin itu membantu dalam beberapa kasus
Meskipun Anda dapat membuat alias tabel di dalam kueri Anda (yaitu, "PILIH u.username FROM users u;"), Anda harus menggunakan nama sebenarnya dari kolom yang Anda referensikan. AS hanya memengaruhi bagaimana bidang dikembalikan.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Baru saja mengalami masalah ini.
Pastikan tidak ada spasi di nama entitas di database.
misalnya 'user_name' bukan 'user_name'
coba tugas Anda menggunakan kondisi IN atau OR dan juga kueri ini bekerja di spark-1.6.x
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
atau
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
Saya memiliki masalah yang sama, saya merasa ini berguna.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
ingat untuk memasukkan $ user dalam tanda kutip tunggal ''.