আমার কাছে একটি টেবিল রয়েছে যা শিক্ষকদের জন্য উপলব্ধ অ্যাপয়েন্টমেন্ট সঞ্চয় করে রাখে, দুই ধরণের সন্নিবেশকে অনুমতি দেয়:
প্রতি ঘণ্টার ভিত্তিতে : শিক্ষক প্রতি দিন সীমাহীন স্লট যোগ করার সম্পূর্ণ স্বাধীনতার সাথে (যতক্ষণ না স্লট ওভারল্যাপ হয় না): 15 / এপ্রিল একজন শিক্ষকের 10:00, 11:00, 12:00 এবং 16:00 এ স্লট থাকতে পারে । একটি নির্দিষ্ট শিক্ষক সময় / স্লট চয়ন করার পরে একজন ব্যক্তির পরিবেশন করা হয়।
সময়কাল / ব্যাপ্তি : 15 / এপ্রিল অপর একজন শিক্ষক 10:00 থেকে 12:00 এবং তারপরে 14:00 থেকে 18:00 পর্যন্ত কাজ করতে পারে। একজন ব্যক্তির আগমনের আদেশ দ্বারা পরিবেশন করা হয়, সুতরাং যদি কোনও শিক্ষক 10:00 থেকে 12:00 অবধি কাজ করেন তবে এই সময়ের মধ্যে আগত সমস্ত ব্যক্তি আগমনের আদেশে উপস্থিত হবে (স্থানীয় সারি)।
যেহেতু আমাকে অনুসন্ধানের জন্য সমস্ত উপলব্ধ শিক্ষককে ফিরিয়ে দিতে হবে, তাই আমার আগমনী রেঞ্জের ক্রম অনুসারে একই সারণীতে সমস্ত স্লট সংরক্ষণ করতে হবে। এইভাবে আমি তারিখ_ফর্ম থেকে এএসসি অর্ডার করতে পারি, অনুসন্ধানের ফলাফলের প্রথম প্রথম উপলব্ধ স্লটগুলি দেখিয়ে।
বর্তমান টেবিল কাঠামো
CREATE TABLE `teacher_slots` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`teacher_id` mediumint(8) unsigned NOT NULL,
`city_id` smallint(5) unsigned NOT NULL,
`subject_id` smallint(5) unsigned NOT NULL,
`date_from` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`date_to` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`status` tinyint(4) NOT NULL DEFAULT '0',
`order_of_arrival` tinyint(1) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `by_hour_idx` (`teacher_id`,`order_of_arrival`,`status`,`city_id`,`subject_id`,`date_from`),
KEY `order_arrival_idx` (`order_of_arrival`,`status`,`city_id`,`subject_id`,`date_from`,`date_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
অনুসন্ধান অনুসন্ধান
আমাকে এগুলি দ্বারা ফিল্টার করতে হবে: আসল তারিখের সময়, সিটি_আইডি, সাবজেক্ট_আইডি এবং যদি একটি স্লট উপলব্ধ থাকে (স্থিতি = 0)।
জন্য ঘনঘন ভিত্তিক আমি প্রতি শিক্ষকের জন্য প্রথম নিকটতম প্রাপ্তিসাধ্য প্রতিদিন সমস্ত উপলব্ধ স্লট দেখাতে হবে (ক নির্দিষ্ট দিনে সব সময় স্লট দেন এবং একই শিক্ষক চেয়ে আরো একদিন দেখাতে পারছি না)। ( ম্যাটেডগোডের সাহায্যে আমি কোয়েরিটি পেয়েছি )।
জন্য ভিত্তি পরিসীমা (order_of_arrival = 1), আমি নিকটস্থ পরিসীমা উপলব্ধ, শিক্ষক প্রতি শুধু একটা সময় প্রদর্শন করতে হবে।
প্রথম ক্যোয়ারী পৃথকভাবে 0.10 এমএস, দ্বিতীয় কোয়েরি 0.08 এমএস এবং ইউনিয়ন সব মিলিয়ে 300ms গড়ে চলে runs
(
SELECT id, teacher_slots.teacher_id, date_from, date_to, order_of_arrival
FROM teacher_slots
JOIN (
SELECT DATE(MIN(date_from)) as closestDay, teacher_id
FROM teacher_slots
WHERE date_from >= '2014-04-10 08:00:00' AND order_of_arrival = 0
AND status = 0 AND city_id = 6015 AND subject_id = 1
GROUP BY teacher_id
) a ON a.teacher_id = teacher_slots.teacher_id
AND DATE(teacher_slots.date_from) = closestDay
WHERE teacher_slots.date_from >= '2014-04-10 08:00:00'
AND teacher_slots.order_of_arrival = 0
AND teacher_slots.status = 0
AND teacher_slots.city_id = 6015
AND teacher_slots.subject_id = 1
)
UNION ALL
(
SELECT id, teacher_id, date_from, date_to, order_of_arrival
FROM teacher_slots
WHERE order_of_arrival = 1 AND status = 0 AND city_id = 6015 AND subject_id = 1
AND (
(date_from <= '2014-04-10 08:00:00' AND date_to >= '2014-04-10 08:00:00')
OR (date_from >= '2014-04-10 08:00:00')
)
GROUP BY teacher_id
)
ORDER BY date_from ASC;
প্রশ্ন
ইউনিয়নটিকে অনুকূলিত করার কোনও উপায় আছে, তাই আমি কেবলমাত্র একটি ক্যোয়ারির ভিত্তিতে সর্বাধিক 20 ডলার বা এমনকি বেড়ান ঘড়ির ভিত্তিতে (একটি আইএফ ইত্যাদির সাথে) এর যুক্তিসঙ্গত প্রতিক্রিয়া পেতে পারি?
এসকিউএল ফিডল: http://www.sqlfiddle.com/#!2/59420/1/0
সম্পাদনা করুন:
আমি কেবলমাত্র তারিখটি সংরক্ষণ করেছি এমন একটি ক্ষেত্র "কেবল_ তারিখ_ফর্ম" তৈরি করে কিছু অস্বীকৃতির চেষ্টা করেছি যাতে আমি এটি পরিবর্তন করতে পারি ...
DATE(MIN(date_from)) as closestDay / DATE(teacher_slots.date_from) = closestDay
... এই
MIN(only_date_from) as closestDay / teacher_slots.only_date_from = closestDay
এটি ইতিমধ্যে আমার 100 মিমি সংরক্ষণ করেছে! এখনও গড়ে 200 মি।