जवाबों:
एसक्यूएल का मूल्यांकन पीछे से, दाएं से बाएं किया जाता है। इसलिए जहां क्लॉज को पार्स किया गया है और चयन क्लॉज से पहले मूल्यांकन करें। इसके कारण user_name के लिए u_name का परिवर्तन अभी तक नहीं हुआ है।
निम्नलिखित 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, "स्तंभ उपनाम के साथ समस्याएं" देखें।
select u_name as user_name from users where u_name = "john";
इसे इस तरह से सोचें, आपका वह खंड जहां पहले मूल्यांकन करता है, यह निर्धारित करने के लिए कि किन पंक्तियों (या सम्मिलित पंक्तियों) को वापस करने की आवश्यकता है। एक बार जहाँ क्लॉज़ निष्पादित हो जाता है, उसके लिए सेलेक्ट क्लॉज़ चलता है।
इसे बेहतर तरीके से रखने के लिए, इसकी कल्पना करें:
select distinct(u_name) as user_name from users where u_name = "john";
आप दूसरे के बिना पहली छमाही का संदर्भ नहीं दे सकते। जहां हमेशा पहले मूल्यांकन किया जाता है, उसके बाद चयन खंड।
यदि आप निम्नलिखित की तरह एक क्वेरी करने की कोशिश कर रहे हैं (कम से कम एक अनुलग्नक के साथ सभी नोड्स ढूंढें) जहां आपने एक नया फ़ील्ड बनाने के लिए एक सेलेक्ट स्टेटमेंट का उपयोग किया है जो वास्तव में डेटाबेस में मौजूद नहीं है, और उपयोग करने का प्रयास करें उस परिणाम के लिए उपनाम जो आप उसी समस्या में चलाएंगे:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
आपको "अज्ञात कॉलम 'अटैचमेंट' 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;
आपको अभी भी उपनाम वापस मिल जाएगा, लेकिन अब एसक्यूएल को अज्ञात उपनाम में नहीं देना चाहिए।
(
आपकी क्वेरी में आपके पास एक अतिरिक्त है (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";
यदि आरडीबीएमएस इन-लाइन दृश्य में धक्का देने का समर्थन करता है तो बाद वाले को पूर्व जैसा ही होना चाहिए।
सही किया:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
नहीं, आपको इसे सही नाम के साथ चुनने की आवश्यकता है। यदि आप किसी अन्य नाम से चयनित तालिका देते हैं तो आप उसका उपयोग कर सकते हैं।
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";
यह काम करता हैं।
लेकिन आप क्या करते हैं सुनिश्चित करें!
लेकिन, हो सकता है कि यह कुछ मामलों में मदद करे
जब आप अपनी क्वेरी के भीतर अपनी सारणी को अन्य नाम दे सकते हैं (जैसे, "उपयोगकर्ताओं से u.username का चयन करें!"), आपको उन स्तंभों के वास्तविक नामों का उपयोग करना होगा जिन्हें आप संदर्भित कर रहे हैं। एएस ही प्रभावित करता है कि खेतों को कैसे लौटाया जाता है।
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
बस यह समस्या थी।
सुनिश्चित करें कि डेटाबेस में इकाई के नाम पर कोई स्थान नहीं है।
उदाहरण के लिए 'user_name' के बजाय 'user_name'
अपने कार्य को IN या OR शर्त का उपयोग करके देखें और यह क्वेरी स्पार्क-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'");
$ 'यूजर को सिंगल कोट्स में रखना याद रखें।