মাইএসকিউএল ক্যোয়ারীর WHERE ধারাটিতে কলামের নাম ব্যবহার করা ত্রুটি তৈরি করে


201

আমি যে ক্যোয়ারীটি চালাচ্ছি সেগুলি নিম্নরূপ, তবে আমি এই ত্রুটিটি পাচ্ছি:

# 1054 - 'IN / ALL / যেকোন উপকুলিতে' অজানা কলাম 'গ্যারান্টিযুক্ত_পস্টকোড'

SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE `guaranteed_postcode` NOT IN #this is where the fake col is being used
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN
 (
  'australia'
 )
)

আমার প্রশ্নটি: একই ডিবি কোয়েরির ধারাটিতে আমি কেন একটি নকল কলাম ব্যবহার করতে অক্ষম?

উত্তর:


434

আপনি কেবল গ্রুপ বাই, অর্ডার বা হ'ল ক্লজগুলিতে কলামের নাম ব্যবহার করতে পারেন।

স্ট্যান্ডার্ড এসকিউএল আপনাকে যেখানে একটি বিভাজনে একটি কলামের ওরফে উল্লেখ করতে দেয় না। এই বিধিনিষেধ আরোপ করা হয়েছে কারণ যখন WHERE কোডটি কার্যকর করা হয় তখন কলাম মানটি নির্ধারিত হতে পারে।

মাইএসকিউএল ডকুমেন্টেশন থেকে অনুলিপি করা হয়েছে

মন্তব্যে নির্দেশিত হিসাবে, পরিবর্তে HAVING ব্যবহার করা কাজটি করতে পারে। যদিও এই যেখানে ভার্সাম বনাম রয়েছে তাতে একটি পঠন দেওয়ার বিষয়টি নিশ্চিত করুন ।


1
দ্রুত এবং নির্ভুল প্রতিক্রিয়ার জন্য চিয়ার্স! আমি HAVING ধারাটি একবার দেখেছি এবং এই ক্যোয়ারীটি সফলভাবে চালানোর জন্য একটি উপায় নিয়ে কাজ করেছি। আবার ধন্যবাদ.
জেমস

38
যদি আমার মতো কারও কারও সমতুল্য সমস্যা থাকে তবে সে ক্ষেত্রে অ্যালিজেড কোল ব্যবহার করা হয়েছিল যেখানে ধারাটি ব্যর্থ হচ্ছে - 'WHERE' এর জন্য 'হ্যাপিং' এর জন্য সোয়াপিং করে সরাসরি এটি ঠিক করা হয়েছে +1 ভাল উত্তর।
মেগাস্টেভ 4

@ মেগাস্টেভ 4 আমারও একই সমস্যা ছিল! "হ্যাভিং" ব্যবহার করে এটি সহজেই সমাধান করা হয়েছে। :)
জোহান

9
এটি আপনার ক্ষেত্রে গুরুত্বপূর্ণ বা নাও হতে পারে তবে এর HAVINGচেয়ে ধীর সম্পাদন করেWHERE
ডিটিএস

1
havingকাজ করার কারণটি হ'ল কলামের মানগুলি আপনি যখন যাবেন তার সময় দিয়ে গুণতে হবে having। এটি whereউপরে বর্ণিত হিসাবে, ক্ষেত্রে নয় ।
মিলি স্মিথ

24

ভিক্টর যেমন উল্লেখ করেছেন, সমস্যাটি ওরফে আছে। যদিও এখান থেকে এড়ানো যায়, যেখানে যেখানে এক্স এক্স ওয়াই ক্লোজের মধ্যে সরাসরি এক্সপ্রেশনটি রেখে:

SELECT `users`.`first_name`,`users`.`last_name`,`users`.`email`,SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN #this is where the fake col is being used
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN
 (
  'australia'
 )
)

যাইহোক, আমি অনুমান করি এটি খুব অযোগ্য, যেহেতু বাইরের ক্যোয়ারীর প্রতিটি সারির জন্য সাবকিউরিটি কার্যকর করতে হবে।


1
@ প্রজনন, হ্যাঁ আমি বিশ্বাস করি এটি মারাত্মক ধীর এবং অদক্ষ।
পেসারিয়ার 21

20

স্ট্যান্ডার্ড এসকিউএল (বা মাইএসকিউএল) যেখানে একটি বিধি হিসাবে কলামের নাম ব্যবহারের অনুমতি দেয় না কারণ এটি

যখন WHERE ধারাটি মূল্যায়ন করা হয়, কলামের মানটি এখনও নির্ধারণ করা হয়নি।

( মাইএসকিউএল ডকুমেন্টেশন থেকে )। কি আপনি কি করতে পারেন কলাম মান নিরূপণ হয় কোথায় দফা, একটি পরিবর্তনশীল মান সংরক্ষণ করুন এবং ক্ষেত্র তালিকায় এটি ব্যবহার। উদাহরণস্বরূপ আপনি এটি করতে পারেন:

SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
@postcode AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE (@postcode := SUBSTRING(`locations`.`raw`,-6,4)) NOT IN
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN
 (
  'australia'
 )
)

কোডটি বজায় রাখা সহজ করে তোলে, এটি জটিল হওয়ার সাথে সাথে অভিব্যক্তিটির পুনরাবৃত্তি এড়ানো যায়।


9
এই ডকুমেন্টেশনের সাথে এই বিরোধ নেই যা বলে যে "একটি সাধারণ নিয়ম হিসাবে আপনার কোনও ব্যবহারকারীর ভেরিয়েবলের জন্য কোনও মূল্য নির্ধারণ করা উচিত নয় এবং একই বিবৃতিতে মানটি পড়া উচিত। আপনি প্রত্যাশিত ফলাফলগুলি পেতে পারেন, তবে এটি নিশ্চিত নয়"। ?
আরজান

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

কয়েকটি উদাহরণ: কেউ কেউ দাবি করেছেন যে তাদের জন্য select @code:=sum(2), 2*@codeমাইএসকিউএল ৫.৫ এ কাজ করে, তবে আমার জন্য ৫. in দ্বিতীয় কলামে প্রথম অনুরোধে NULL আসে এবং আবার চালিত হওয়ার পরে তার আগের ফলাফলের 2 বার ফিরে আসে । যথেষ্ট আকর্ষণীয়, উভয়ই নির্বাচন করুন @code:=2, 2*@codeএবং select @code:=rand(), 2*@codeআমার 5.6 (আজ) তে কাজ করে বলে মনে হচ্ছে। কিন্তু সেগুলি সত্যই নির্বাচনী দফায় লেখা এবং পড়ছে; আপনার ক্ষেত্রে আপনি এটি WHERE এ সেট করছেন।
আরজান

@ জনি, কেন শুধু দু'বার শর্তটি মূল্যায়ন করবেন না? অবশ্যই মাইএসকিউএল এটি অপ্টিমাইজ করার জন্য যথেষ্ট স্মার্ট .......
পেসারিয়ার

@ পেসারিয়ের অভিব্যক্তিটি পুনরাবৃত্তি করতে হবে এখনও বিশেষত এটি জটিল। মাইএসকিউএল সাধারণ স্যবপ্রেসেশন নির্মূলকরণ প্রয়োগ করে কিনা তা নিশ্চিত করতে সক্ষম হয়েছি।
জনি

16

হয়তো আমার উত্তরটি খুব দেরিতে হয়েছে তবে এটি অন্যকে সাহায্য করতে পারে।

আপনি এটিকে অন্য একটি নির্বাচনী বিবৃতি দিয়ে ঘিরে রাখতে পারেন এবং যেখানে এর ক্লজ ব্যবহার করতে পারেন।

SELECT * FROM (Select col1, col2,...) as t WHERE t.calcAlias > 0

ক্যালকাআলিয়াস হ'ল উপনাম কলাম যা গণনা করা হয়েছিল।


সুন্দর এবং সংক্ষিপ্ত, তবে এটি দরকারী হিসাবে খুব অস্পষ্ট।
আগামেমনাস

@ আগামেমনস, আপনি এর অর্থ কী?
পেসারিয়ার 21

প্রশ্নটি ছিল, "আমি কেন একই ডিবি কোয়েরির ধারাটিতে একটি নকল কলাম ব্যবহার করতে পারছি না?" এই উত্তরটি সেই প্রশ্নের উত্তর দেয় না এবং একটি ক্রিয়া অনুপস্থিত।
আগামেমনস

তারপরে কেবল হ্যাভিং
হেট

8

আপনি নির্বাচন ক্ষেত্র এবং উপাধিতে গণনা করা ফিল্টারটির জন্য HAVING ধারাটি ব্যবহার করতে পারেন


@ fahimg23 - নিশ্চিত নয় আমি এর কারণ খোঁজার চেষ্টা করেছি, কিন্তু পারছি না! যদিও WHEREএবং এর মধ্যে পার্থক্য মনে রাখবেন HAVING। তারা অভিন্ন নয়। stackoverflow.com/search?q=where+vs+having
rinogo

আপডেট: কারণ এই উত্তরটি একই সমাধান সরবরাহ করে তবে আরও তথ্যের সাথে।
রিনোগো

1

আমি mysql 5.5.24 ব্যবহার করছি এবং নিম্নলিখিত কোডটি কাজ করে:

select * from (
SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
) as a
WHERE guaranteed_postcode NOT IN --this is where the fake col is being used
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN
 (
  'australia'
 )
)

0

স্ট্যান্ডার্ড এসকিউএল WHERE ধারাটিতে কলামের অন্যান্য নামগুলি উল্লেখ অস্বীকার করে। এই সীমাবদ্ধতা আরোপ করা হয়েছে কারণ যখন WHERE ধারাটি মূল্যায়ন করা হয়, কলাম মানটি এখনও নির্ধারণ করা হয়নি। উদাহরণস্বরূপ, নিম্নলিখিত ক্যোয়ারী অবৈধ:

আইডি নির্বাচন করুন, COUNT (*) হিসাবে tbl_name হিসাবে সিএনটি> 0 আইডি দ্বারা গ্রুপ;


0

যেখানে কনডিটনের জন্য আপনি সাবস্ক্রিং ( locationsraw, -6,4) ব্যবহার করতে পারেন

SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
 'australia'
)
)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.