উত্তর:
ডান থেকে বাম দিকে এসকিউএল পিছনের দিকে মূল্যায়ন করা হয়। সুতরাং যেখানে ক্লজটি বিশ্লেষণ করা হয়েছে এবং নির্বাচিত ধারাটির পূর্বে মূল্যায়ন করুন। এর কারণে ব্যবহারকারী_নামে ইউ_নামের অ্যালিজিং এখনও ঘটেনি।
নিম্নলিখিত মাইএসকিউএল ম্যানুয়াল পৃষ্ঠাটি দেখুন: http://dev.mysql.com/doc/refman/5.0/en/select.html
"একটি নির্বাচন_প্রেসকে এএস উপনাম_নাম ব্যবহার করে একটি উপাত্ত দেওয়া যেতে পারে The উপন্যাসটি এক্সপ্রেশনটির কলামের নাম হিসাবে ব্যবহৃত হয় এবং গ্রুপ বা অর্ডার বা আওতায় থাকা অনুচ্ছেদে ব্যবহার করা যেতে পারে" "
(...)
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";
আপনি subquery বা কোনও গণনা ফলাফল হিসাবে ব্যবহারকারী সংজ্ঞায়িত উপনামের ফলাফল হিসাবে একই এটি 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";
এটা কাজ করে।
তবে আপনি যা করেন তা নিশ্চিত করুন!
তবে, হতে পারে এটি কিছু ক্ষেত্রে সহায়তা করে
আপনি যখন আপনার টেবিলগুলিকে আপনার ক্যোয়ারির মধ্যে উদ্বোধন করতে পারেন (যেমন, "ব্যবহারকারীদের থেকে ব্যবহারকারী নির্বাচন করুন;"), আপনাকে উল্লেখ করা কলামগুলির প্রকৃত নামগুলি ব্যবহার করতে হবে। ক্ষেত্রগুলি কীভাবে ফিরে আসবে তা কেবল প্রভাবিত করে।
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
শুধু এই সমস্যা ছিল।
ডাটাবেসে সত্তার নামে কোনও স্থান নেই তা নিশ্চিত করুন।
যেমন 'ব্যবহারকারীর নাম' এর পরিবর্তে 'ব্যবহারকারীর নাম'
IN শর্ত বা OR শর্ত ব্যবহার করে আপনার টাস্কটি চেষ্টা করে দেখুন এবং এই কোয়েরিটি স্পার্ক-১.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'");
মনে রাখবেন $ ব্যবহারকারীকে 'একক উদ্ধৃতিতে'।