আপনার সমাধানটি গ্রুপের মাধ্যমে সম্প্রসারণের একটি বিস্তৃতি ব্যবহার করে যা কিছু ক্ষেত্র দ্বারা গ্রুপ করার অনুমতি দেয় (এই ক্ষেত্রে কেবলমাত্র post_author):
GROUP BY wp_posts.post_author
এবং অনাগ্রেগ্রেটেড কলামগুলি নির্বাচন করুন:
SELECT wp_posts.*
যেগুলি দফা দ্বারা গোষ্ঠীতে তালিকাভুক্ত নয়, বা এটি সামগ্রিক ফাংশনে (এমআইএন, ম্যাক্স, COUNT, ইত্যাদি) ব্যবহৃত হয় না।
অনুচ্ছেদে GROUP এ সম্প্রসারণের সঠিক ব্যবহার
এটি কার্যকর যখন অ-সংগৃহীত কলামগুলির সমস্ত মান প্রতিটি সারির জন্য সমান হয়।
উদাহরণস্বরূপ, ধরুন আপনার একটি টেবিল রয়েছে GardensFlowers( nameবাগানের, flowerযা বাগানে বেড়ে ওঠে):
INSERT INTO GardensFlowers VALUES
('Central Park', 'Magnolia'),
('Hyde Park', 'Tulip'),
('Gardens By The Bay', 'Peony'),
('Gardens By The Bay', 'Cherry Blossom');
এবং আপনি বাগানে যে সমস্ত ফুল গজায় সেগুলি বের করতে চান, যেখানে একাধিক ফুল জন্মায়। তারপরে আপনাকে একটি সাবকিউরি ব্যবহার করতে হবে, উদাহরণস্বরূপ আপনি এটি ব্যবহার করতে পারেন:
SELECT GardensFlowers.*
FROM GardensFlowers
WHERE name IN (SELECT name
FROM GardensFlowers
GROUP BY name
HAVING COUNT(DISTINCT flower)>1);
পরিবর্তে গার্ডারের একমাত্র ফুল যা আপনার সমস্ত ফুল থেকে বের করে নেওয়া দরকার, আপনি কেবল এই অবস্থায় থাকা অবস্থায় পরিবর্তন করতে পারবেন, তবে মাই এসকিএল HAVING COUNT(DISTINCT flower)=1আপনাকে এটি ব্যবহার করতে দেয়:
SELECT GardensFlowers.*
FROM GardensFlowers
GROUP BY name
HAVING COUNT(DISTINCT flower)=1;
কোনও সাবকিউরি নয়, স্ট্যান্ডার্ড এসকিউএল নয়, তবে সহজ।
বিভাগের দ্বারা GROUP এ সম্প্রসারণের ভুল ব্যবহার
তবে আপনি যদি প্রতিটি সারির জন্য সমান নয় এমন অ-সমষ্টিযুক্ত কলামগুলি নির্বাচন করেন তবে কী হবে? মাইএসকিউএল column কলামটির জন্য কোন মানটি পছন্দ করে?
দেখে মনে হচ্ছে যে মাইএসকিউএল সর্বদা এর মুখোমুখি হওয়া প্রথম মানটি চয়ন করে ।
এটির প্রথম মানটি যে মুখোমুখি হয় তা হ'ল আপনি যে মানটি চান তা হ'ল নিশ্চিত করার জন্য GROUP BYআপনাকে একটি অর্ডার করা ক্যোয়ারিতে একটি প্রয়োগ করতে হবে , তাই সাবকিউরি ব্যবহার করা দরকার। আপনি অন্যথায় এটি করতে পারবেন না।
এই ধারণাটি দেওয়া যে মাইএসকিউএল সর্বদা এটির প্রথম সারিটি বেছে নেয়, আপনি গ্রুপের মাধ্যমে সঠিকভাবে সারিগুলি বাছাই করছেন। তবে দুর্ভাগ্যক্রমে, আপনি যদি ডকুমেন্টেশনটি মনোযোগ সহকারে পড়েন তবে আপনি লক্ষ্য করবেন যে এই অনুমানটি সত্য নয়।
সর্বদা এক নয় এমন অ-সংগৃহীত কলামগুলি নির্বাচন করার সময়, মাইএসকিউএল কোনও মান চয়ন করতে নিখরচায় থাকে, সুতরাং ফলস্বরূপ যে মানটি এটি প্রকৃতপক্ষে দেখায় তা অনির্দিষ্ট ।
আমি দেখতে পাচ্ছি যে অ-একত্রিত কলামের প্রথম মানটি পেতে এই কৌশলটি প্রচুর পরিমাণে ব্যবহৃত হয় এবং এটি সাধারণত / প্রায়শই সবসময় কাজ করে, আমি এটি কখনও কখনও পাশাপাশি ব্যবহার করি (আমার নিজের ঝুঁকিতে)। তবে এটি নথিভুক্ত না হওয়ায় আপনি এই আচরণের উপর নির্ভর করতে পারবেন না।
এই লিঙ্কটি (ধন্যবাদ ইপারকিউব!) গ্রুপ দ্বারা কৌশলটিকে অপ্টিমাইজ করা হয়েছে এমন পরিস্থিতি দেখায় যেখানে একই ক্যোয়ারী মাইএসকিএল এবং মারিয়াডিবি-র মধ্যে পৃথক ফলাফল দেয়, সম্ভবত কোনও ভিন্ন অপটিমাইজেশন ইঞ্জিনের কারণে।
সুতরাং, এই কৌশলটি যদি কাজ করে তবে এটি ভাগ্যের বিষয়।
অন্যান্য প্রশ্নে গৃহীত উত্তর আমার কাছে ভুল দেখায়:
HAVING wp_posts.post_date = MAX(wp_posts.post_date)
wp_posts.post_dateএটি একটি অ-সংগৃহীত কলাম এবং এটির মান আনুষ্ঠানিকভাবে নির্ধারিত হবে, তবে এটি সম্ভবত প্রথম post_dateমুখোমুখি হবে। তবে যেহেতু GROUP BY কৌশলটি একটি আনর্ডার্ডেড টেবিলের সাথে প্রয়োগ করা হয়েছে, এটি নিশ্চিত নয় যে কোনটি প্রথম post_dateসম্মুখীন হয়েছিল।
এটি সম্ভবত একক লেখকের একমাত্র পোস্ট এমন পোস্টগুলি ফিরিয়ে দেবে, তবে এটি সর্বদা নিশ্চিত নয়।
একটি সম্ভাব্য সমাধান
আমি মনে করি এটি একটি সম্ভাব্য সমাধান হতে পারে:
SELECT wp_posts.*
FROM wp_posts
WHERE id IN (
SELECT max(id)
FROM wp_posts
WHERE (post_author, post_date) = (
SELECT post_author, max(post_date)
FROM wp_posts
WHERE wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY post_author
) AND wp_posts.post_status='publish'
AND wp_posts.post_type='post'
GROUP BY post_author
)
অভ্যন্তরীণ কোয়েরিতে আমি প্রতিটি লেখকের সর্বাধিক পোস্টের তারিখটি ফিরিয়ে দিচ্ছি। তারপরে আমি এই বিষয়টি বিবেচনা করছি যে একই লেখক তাত্ত্বিকভাবে একই সাথে দুটি পোস্ট থাকতে পারে, তাই আমি কেবল সর্বোচ্চ আইডি পাচ্ছি। এবং তারপরে আমি সর্বাধিক আইডি থাকা সমস্ত সারিটি ফিরিয়ে দিচ্ছি। এটি আইএন ক্লজের পরিবর্তে যোগ দিয়ে দ্রুত তৈরি করা যেতে পারে।
(যদি আপনি নিশ্চিত হন যে IDএটি কেবল বৃদ্ধি পাচ্ছে, এবং এর ID1 > ID2অর্থ যদি এর অর্থ হয় post_date1 > post_date2, তবে ক্যোয়ারীটি আরও সহজতর করা যেতে পারে, তবে আমি নিশ্চিত নই যে এটি ঘটনাটি কিনা)।
post_authorএবংpost_dateএকটি অনন্য সারি পাওয়ার জন্য পর্যাপ্ত নয়, তাই প্রতি অনন্য সারি পাওয়ার জন্য আরও অনেক কিছু থাকতে হবেpost_author