SELECT অর্ডার সংরক্ষণের জন্য CASE স্টেটমেন্ট ব্যবহার করা ভালো। UNION ব্যবহার না করুন। প্রথমে একটি টেবিল তৈরি করি:
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
ShippingDate DATETIME
);
রেকর্ড যোগ করি:
mysql> INSERT INTO DemoTable(ShippingDate) VALUES('2019-04-21');
mysql> INSERT INTO DemoTable(ShippingDate) VALUES('2019-01-01');
mysql> INSERT INTO DemoTable(ShippingDate) VALUES('2019-05-11');
mysql> INSERT INTO DemoTable(ShippingDate) VALUES('2018-12-31');
mysql> INSERT INTO DemoTable(ShippingDate) VALUES('2019-02-18');
সকল রেকর্ড দেখতে:
mysql> SELECT * FROM DemoTable;
আউটপুট:
+----+---------------------+ | Id | ShippingDate | +----+---------------------+ | 1 | 2019-04-21 00:00:00 | | 2 | 2019-01-01 00:00:00 | | 3 | 2019-05-11 00:00:00 | | 4 | 2018-12-31 00:00:00 | | 5 | 2019-02-18 00:00:00 | +----+---------------------+
CASE ব্যবহার করে অর্ডার সংরক্ষণের কোয়েরি (আগামী তারিখগুলো আগে, তারপর অতীতের তারিখ):
mysql> SELECT * FROM DemoTable
ORDER BY CASE
WHEN ShippingDate < CURDATE() THEN ShippingDate
ELSE CURDATE()
END DESC, ShippingDate ASC;
আউটপুট (ধরে নিচ্ছি CURDATE() = '2019-06-04'):
+----+---------------------+ | Id | ShippingDate | +----+---------------------+ | 3 | 2019-05-11 00:00:00 | | 1 | 2019-04-21 00:00:00 | | 5 | 2019-02-18 00:00:00 | | 2 | 2019-01-01 00:00:00 | | 4 | 2018-12-31 00:00:00 | +----+---------------------+
ব্যাখ্যা: এখানে CASE এক্সপ্রেশন দুটি গ্রুপ বানাচ্ছে: ভবিষ্যতের তারিখ (CURDATE() বা তার পরে) এবং অতীতে তারিখ। ভবিষ্যতের গ্রুপে সবার জন্য একই মান (CURDATE()) এসাইন করা হয়েছে, তাই সেগুলো ShippingDate ASC দিয়ে সাজছে। অতীতের গ্রুপে.real তারিখ অনুযায়ী ডিসেন্ডিং সাজছে।
কারণ UNION কাজ করে না: UNION ডিফল্টভাবে ডুপ্লিকেট সরিয়ে দেয় এবং অর্ডার গ্যারান্টি দেয় না (ORDER BY ছাড়া)।