আপনি কি মাইএসকিএলে WHERE ধারাটিতে একটি উপনাম ব্যবহার করতে পারেন?


121

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

sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating

উত্তর:


229

আপনি একটি হ্যাভিং ক্লজ ব্যবহার করতে পারেন, যা উপনামগুলি দেখতে পারে , যেমন

 HAVING avg_rating>5

তবে এমন একটি ক্ষেত্রে যেখানে আপনাকে আপনার অভিব্যক্তি পুনরাবৃত্তি করতে হবে, যেমন

 WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5

কিন্ত! সমস্ত অভিব্যক্তির অনুমতি দেওয়া হবে না - এসইউএম এর মতো সমষ্টিগত ফাংশন ব্যবহার করা কার্যকর হবে না, এক্ষেত্রে আপনাকে একটি HAVING ধারা ব্যবহার করতে হবে।

থেকে মাইএসকিউএল ম্যানুয়াল :

WHERE ধারাটিতে এটি একটি কলামের নাম উল্লেখ করার অনুমতি নেই, কারণ WHERE ধারাটি কার্যকর করা হলে কলাম মানটি এখনও নির্ধারিত হতে পারে। দেখুন অনুচ্ছেদ B.1.5.4, "কলাম ওরফে সমস্যা"


1
যদি আমি

3
এটি পরিষ্কারভাবে একত্রিতকরণের ক্রিয়াকলাপের অনুমতি নেই বলে উল্লেখ করেছেন
পল ডিকসন

সুন্দর ব্যাখ্যা, esp। "তবে একটি যেখানে ধারা ... পুনরাবৃত্তি .." অংশ
th3an0maly

4
এটি একটি উত্তম উত্তর, তবে দয়া HAVINGকরে ডেটা আনার পরে এবং কার্যকর WHEREকরার আগে কার্য সম্পাদনের প্রভাবগুলি বিবেচনা করুন ।
স্টকবি

আপনি যেখানে একটি বিভাজনে মোট ফাংশন ব্যবহার করতে পারবেন না। WHERE ধারাটি একবারে একটি করে সারিগুলি ফিল্টার করে, পুরো গোষ্ঠীগুলি নয়।
বিল কারভিন

33

ডান্নো যদি এটি মাইএসকিএলে কাজ করে তবে স্কেলসার্ভার ব্যবহার করে আপনি কেবল এটির মতো গুটিয়ে রাখতে পারেন:

select * from (
  -- your original query
  select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating 
  from ...) Foo
where Foo.avg_rating ...

6

এই প্রশ্নটি বেশ পুরানো এবং একটি উত্তর ইতিমধ্যে 160 টি ভোট পেয়েছে ...

তবুও আমি এটিকে পরিষ্কার করে বলব: প্রশ্নটি আসলে উক্ত নামগুলিতে ধারাটিতে ব্যবহার করা যায় কিনা তা নিয়ে নয়WHERE

sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating

একটি সমষ্টি। ইন WHEREদফা আমরা তাদের মান দিকে তাকিয়ে রেকর্ড টেবিল থেকে আমরা চাই সীমাবদ্ধ করে। sum(reviews.rev_rating)এবং count(reviews.rev_id), যাইহোক, মানগুলি আমরা রেকর্ডে পাই না; সেগুলি মানগুলি আমরা কেবল রেকর্ডগুলি একত্রিত করার পরে পাই।

তাই WHEREঅনুচিত। আমাদের দরকার HAVING, যেমন আমরা একত্রিত হওয়ার পরে ফলাফলের সারিগুলিকে সীমাবদ্ধ করতে চাই। এটা হতে পারে না

WHERE avg_rating > 10

না

WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10

অত: পর।

HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10

অন্যদিকে সম্ভব এবং এসকিউএল স্ট্যান্ডার্ড মেনে চলে। যেহেতু

HAVING avg_rating > 10

শুধুমাত্র মাইএসকিউএলে সম্ভব। এটি স্ট্যান্ডার্ড অনুযায়ী বৈধ এসকিউএল নয়, কারণ SELECTধারাটি পরে কার্যকর হওয়ার কথা HAVING। মাইএসকিউএল ডক্স থেকে:

স্ট্যান্ডার্ড এসকিউএল-এর আরও একটি মাইএসকিউএল এক্সটেনশান নির্বাচন তালিকার বিকল্পযুক্ত অভিব্যক্তির HAVING ধারাটিতে রেফারেন্সের অনুমতি দেয়।

মাইএসকিউএল এক্সটেনশন একত্রিত কলামের জন্য HAVING ধারাটিতে একটি উপনামের ব্যবহারের অনুমতি দেয়

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html


0

যদি আপনার জিজ্ঞাসাটি স্থিতিশীল হয় তবে আপনি এটিকে একটি দর্শন হিসাবে সংজ্ঞায়িত করতে পারেন তবে আপনি যেখানে ভিউটি জিজ্ঞাসা করার সময় সেই উলামটি ব্যবহার করতে পারেন।


0
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.