ฉันมีคำถามง่ายๆ:
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'
หรือไม่?
ฉันมีคำถามง่ายๆ:
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'
หรือไม่?
คำตอบ:
SQL จะประเมินย้อนหลังจากขวาไปซ้าย ดังนั้นตำแหน่งที่จะแยกวิเคราะห์และประเมินก่อนที่จะเลือกอนุประโยค ด้วยเหตุนี้การตั้งนามแฝงของ u_name เป็น user_name จึงยังไม่เกิดขึ้น
ดูหน้าคู่มือ MySQL ต่อไปนี้: http://dev.mysql.com/doc/refman/5.0/en/select.html
"select_expr สามารถกำหนดนามแฝงได้โดยใช้ AS alias_name นามแฝงใช้เป็นชื่อคอลัมน์ของนิพจน์และสามารถใช้ใน GROUP BY, ORDER BY หรือ HAVING clauses"
( ... )
ไม่อนุญาตให้อ้างถึงนามแฝงคอลัมน์ในส่วนคำสั่ง WHERE เนื่องจากค่าคอลัมน์อาจยังไม่ถูกกำหนดเมื่อเรียกใช้คำสั่ง WHERE ดูหัวข้อ B.5.4.4“ ปัญหาเกี่ยวกับชื่อแทนคอลัมน์”
select u_name as user_name from users where u_name = "john";
ลองนึกดูแบบนี้โดยที่ clause ของคุณจะประเมินก่อนเพื่อกำหนดว่าต้องส่งคืนแถวใด (หรือแถวที่เข้าร่วม) เมื่อเรียกใช้คำสั่ง where แล้วคำสั่ง select จะทำงาน
เพื่อให้ดีขึ้นลองนึกภาพสิ่งนี้:
select distinct(u_name) as user_name from users where u_name = "john";
คุณไม่สามารถอ้างอิงครึ่งแรกโดยไม่มีวินาที โดยจะได้รับการประเมินก่อนเสมอจากนั้นจึงเลือกอนุประโยค
หากคุณกำลังพยายามดำเนินการค้นหาดังต่อไปนี้ (ค้นหาโหนดทั้งหมดที่มีสิ่งที่แนบมาอย่างน้อยหนึ่งรายการ) ที่คุณใช้คำสั่ง SELECT เพื่อสร้างฟิลด์ใหม่ที่ไม่มีอยู่จริงในฐานข้อมูลและลองใช้ นามแฝงสำหรับผลลัพธ์นั้นคุณจะพบปัญหาเดียวกัน:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
คุณจะได้รับข้อผิดพลาด "Unknown column" attachmentcount "ใน WHERE clause"
วิธีแก้ปัญหานั้นค่อนข้างง่าย - เพียงแค่แทนที่นามแฝงด้วยข้อความที่สร้างนามแฝงเช่น:
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."'";
อาจจะช่วยได้
คุณสามารถ
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
มันได้ผล.
แต่ให้แน่ใจว่าคุณทำอะไร!
แต่อาจช่วยได้บ้างในบางกรณี
ในขณะที่คุณสามารถตั้งชื่อแทนตารางของคุณในข้อความค้นหาของคุณ (เช่น "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'
ลองงานของคุณโดยใช้ในเงื่อนไขหรือหรือเงื่อนไขและแบบสอบถามนี้คือการทำงานในจุดประกาย 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';
สำหรับฉันต้นตอของปัญหาคือตัวเลขที่ฉันคัดลอกไปใช้ในคำสั่ง WHERE ตัวเลขมีสัญลักษณ์ "มองไม่เห็น" อย่างน้อยสำหรับ MySQL Workbench ฉันวางหมายเลขไว้ในคอนโซล Chrome ซึ่งมองเห็นได้ชัดเจน
ฉันมีปัญหาเดียวกันฉันพบว่าสิ่งนี้มีประโยชน์
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
อย่าลืมใส่ $ user ในเครื่องหมายคำพูดเดี่ยว