যেখানে অজানা কলাম Cla


126

আমার একটি সাধারণ প্রশ্ন রয়েছে:

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'?

উত্তর:


94

ডান থেকে বাম দিকে এসকিউএল পিছনের দিকে মূল্যায়ন করা হয়। সুতরাং যেখানে ক্লজটি বিশ্লেষণ করা হয়েছে এবং নির্বাচিত ধারাটির পূর্বে মূল্যায়ন করুন। এর কারণে ব্যবহারকারী_নামে ইউ_নামের অ্যালিজিং এখনও ঘটেনি।


30
"পিছনের দিকে" বরং আমি মনে করি "অভ্যন্তরে" বলতে আরও বেশি
জো ফিলিপস

4
এটি আরও বেশি বোঝা যায় যে পুরো বিবৃতিটি একটি জটিল, মাল্টিস্টেজ প্রক্রিয়াতে বিশ্লেষণ, রূপান্তরিত এবং সামগ্রিকভাবে অনুকূলিত করা হয়েছে। "এসকিউএল ডান থেকে বাম দিকে পিছনে মূল্যায়ন করা হয়" ঠিক ভুল
ডেভিড অলড্রিজ

3
'ব্যবহারকারী_নাম' বিবৃতিতে ব্যবহার করা যায় কিনা হিসাবে ব্যবহারকারী জিজ্ঞাসা করা হিসাবে অসম্পূর্ণ উত্তর, উদাহরণস্বরূপ '
হ্যাভিং

45

কি সম্পর্কে:

SELECT u_name AS user_name FROM users HAVING user_name = "john";

16
আপনি এই ক্ষেত্রে HAVINGপরিবর্তে কেন ব্যবহার করবেন WHERE?
পিটেজিও

4
@ পেতিগো পল ডিকসনের উত্তরটি উল্লেখ করে। tldr; WHEE এর চেয়ে পরে মূল্যায়ন করা হয় এবং আরও গুরুত্বপূর্ণভাবে, নির্বাচন করুন।
জাইরবো

38

নিম্নলিখিত মাইএসকিউএল ম্যানুয়াল পৃষ্ঠাটি দেখুন: http://dev.mysql.com/doc/refman/5.0/en/select.html

"একটি নির্বাচন_প্রেসকে এএস উপনাম_নাম ব্যবহার করে একটি উপাত্ত দেওয়া যেতে পারে The উপন্যাসটি এক্সপ্রেশনটির কলামের নাম হিসাবে ব্যবহৃত হয় এবং গ্রুপ বা অর্ডার বা আওতায় থাকা অনুচ্ছেদে ব্যবহার করা যেতে পারে" "

(...)

WHERE ধারাটিতে কলামের উপন্যাসটি উল্লেখ করা অনুমোদিত নয় কারণ WHERE ধারাটি কার্যকর করা হলে কলামের মানটি এখনও নির্ধারিত হতে পারে। বিভাগ B.5.4.4, "কলামের স্থানীয় সমস্যাগুলির সাথে সমস্যা" দেখুন।


এছাড়াও, নোট করুন (মাইএসকিউএল ম্যান থেকে): এসকিউএল স্ট্যান্ডার্ডের জন্য প্রয়োজন যে গ্রুপ বা গ্রুপ ফাংশনে ব্যবহৃত কলামগুলির দ্বারা কেবল গ্রোমের কেবল কলামগুলিই রেফারেন্স করতে হবে। যাইহোক, মাইএসকিউএল এই আচরণের জন্য একটি এক্সটেনশানকে সমর্থন করে এবং সেলেক্ট তালিকার কলামগুলি এবং বাহ্যিক সাবকিউয়েরিতে কলামগুলিও উল্লেখ করার অনুমতি দেয়।
ভিনসেন্ট প্যাসেলার

12
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";

আপনি দ্বিতীয়টি ছাড়া প্রথমার্ধটি উল্লেখ করতে পারবেন না। যেখানে সর্বদা সর্বদা মূল্যায়ন হয়, তারপরে নির্বাচন করুন ধারা।


11

যদি আপনি নীচের মতো কোনও কোয়েরি করার চেষ্টা করছেন (কমপক্ষে একটি সংযুক্তিযুক্ত সমস্ত নোড সন্ধান করুন) যেখানে আপনি একটি নতুন ক্ষেত্র তৈরি করতে একটি নির্বাচনী বিবৃতি ব্যবহার করেছেন যা ডেটাবেজে আসলে বিদ্যমান নেই এবং ব্যবহার করার চেষ্টা করবেন ফলাফলের জন্য উপন্যাসটি আপনি একই সমস্যার মধ্যে চলে যাবেন:

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;

আপনি তবুও উপনামটি ফিরিয়ে আনতে পারবেন তবে এসকিউএল অজানা নামটি ব্যবহার করা উচিত নয়।


1
আমি এই সঠিক সমস্যার মুখোমুখি হয়েছি এবং আপনার উত্তরটি পেরিয়ে এসেছি - ধন্যবাদ! কেবল খেয়াল করার জন্য, এটি (বোধগম্য) বড় ডাটাবেসগুলিতে কিছুটা ধীর গতিতে, তবে আমি যেভাবেই বোকা উত্তরাধিকার সূত্রে প্রাপ্ত ডেটাবেস সেটআপের সাথে কাজ করছি।
লিয়াম নিউমার্চ

আমি বিশ্বাস করি (আপনার কোয়েরিতে অতিরিক্ত অতিরিক্ত রয়েছে (COUNT(*)যা কোথাও বন্ধ নেই।
tftd

3
কিন্তু নির্বাচনী বিবৃতিটি কি দু'বার চালানো হচ্ছে না?
মাতেজ

আমি এখন পর্যন্ত কোনও মাইএসকিএল বিশেষজ্ঞ নই তবে এটি খুব অকার্যকর বলে মনে হচ্ছে। আমি অনুভব করেছি যে নেস্টেড নির্বাচিতরা একটি কোয়েরিটিকে অনেক ধীর করে তোলে।
জিডিওয়াই

8

আপনার সংজ্ঞাটি আপনাকে এর জন্য ক্লজটি ব্যবহার করতে হবে তা aliasদ্বারা স্বাগত জানানো হবে নাWHEREHAVING

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'

7

উভয় ক্ষেত্রেই:

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";

আরডিবিএমএস ইন-লাইন ভিউতে প্রেশিটকে ধাক্কা দিয়ে সমর্থন করে তবে শেষেরটি আগেরটির মতো হওয়া উচিত।



5

আপনার এটি সঠিক নাম দিয়ে নির্বাচন করার দরকার নেই। আপনি যদি টেবিলটি দিয়ে থাকেন তবে আপনি একটি উপনাম থেকে নির্বাচন করেছেন তবে আপনি এটি ব্যবহার করতে পারেন।



1

WHERE1 এবং 2 রেখার কারণে ক্লজটিতে অজানা কলাম এবং লাইন 3 দ্বারা সমাধান হয়েছে:

  1. $sql = "SELECT * FROM users WHERE username =".$userName;
  2. $sql = "SELECT * FROM users WHERE username =".$userName."";
  3. $sql = "SELECT * FROM users WHERE username ='".$userName."'";

আপনি কি পরিবর্তন করেছেন এবং কেন? অতিরিক্তভাবে, আপনি কেন এমন পোস্ট পোস্ট করলেন যা এসকিউএল ইঞ্জেকশনগুলির জন্য বহুল খোলা?
নিকো হাজে

1

এটি সাহায্য হতে পারে।

আপনি পারেন

SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";

এটা কাজ করে।

তবে আপনি যা করেন তা নিশ্চিত করুন!

  • সূচকগুলি এখানে ব্যবহার করা হয় না
  • পুরো টেবিলটি স্ক্যান করা হবে - আপনি সীমাটি 1 অংশ নির্দিষ্ট করেন নি
  • সুতরাং, - এই অ্যাকাউন্টটি বিশাল টেবিলগুলিতে ছোট থাকবে।

তবে, হতে পারে এটি কিছু ক্ষেত্রে সহায়তা করে


0

আপনি যখন আপনার টেবিলগুলিকে আপনার ক্যোয়ারির মধ্যে উদ্বোধন করতে পারেন (যেমন, "ব্যবহারকারীদের থেকে ব্যবহারকারী নির্বাচন করুন;"), আপনাকে উল্লেখ করা কলামগুলির প্রকৃত নামগুলি ব্যবহার করতে হবে। ক্ষেত্রগুলি কীভাবে ফিরে আসবে তা কেবল প্রভাবিত করে।


আমি মনে করি আপনি উদাহরণস্বরূপ মাইএসকিউএলের মতো কিছু আরডিবিএমএসে উপনামটি ব্যবহার করতে পারেন। আপনি SQL সার্ভারের জন্য সঠিক যদিও।
পিটেজিও


0

শুধু এই সমস্যা ছিল।

ডাটাবেসে সত্তার নামে কোনও স্থান নেই তা নিশ্চিত করুন।

যেমন 'ব্যবহারকারীর নাম' এর পরিবর্তে 'ব্যবহারকারীর নাম'


-1

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';

-1

আমার জন্য সমস্যার মূলটি এমন একটি নম্বর ছিল যা আমি যেখানে একটি ক্লজটিতে কপি করেছিলাম। সংখ্যাটিতে অন্তত মাইএসকিউএল ওয়ার্কবেঞ্চের জন্য "অদৃশ্য" চিহ্ন ছিল। আমি ক্রোম কনসোলটিতে নম্বরটি রেখেছিলাম এটি পরিষ্কারভাবে দৃশ্যমান ছিল।


-2

আমার একই সমস্যা ছিল, আমি এটি দরকারী বলে মনে করি।

mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");

মনে রাখবেন $ ব্যবহারকারীকে 'একক উদ্ধৃতিতে'।


1
এই কোডটি এসকিউএল ইঞ্জেকশনের জন্য ব্যাপকভাবে উন্মুক্ত। প্রদত্ত সমস্যা সমাধানের জন্য কারও এই কোডটি ব্যবহার করা উচিত নয়
নিকো হাজে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.