Berikut ini harus membuat Anda pergi. Anda mungkin ingin menyesuaikan contoh fungsi "Current_Date()" saya untuk apa pun tanggal mulai dan tanggal mulai reservasi Anda....
Ini menggunakan variabel sebaris MySQL dalam kueri. Kueri dalam adalah persiapan sederhana dari variabel reservasi (@r) berdasarkan beberapa tanggal mulai ( current_date() ), dan bergabung ke tabel item. Dengan tidak melakukan klausa bergabung, itu akan mengambil satu tanggal untuk setiap item. Dalam skenario saya, saya hanya mempertimbangkan untuk keluar 30 hari, jadi saya telah menerapkan batas 30 item pertama. Tidak ada dasar selain memberi saya cukup catatan sehingga saya tidak perlu membuat tabel sementara berisi 30 catatan (atau berapa hari pun Anda ingin keluar). Ini membuat kueri alias "JustDates" dan memiliki satu kolom "OpenDate". Ini adalah dasar dari rentang tanggal yang akan diuji.
Ini sekarang digabungkan ke tabel item, tetapi tidak ada kondisi yang membuat Cartesian mengatakan untuk setiap tanggal, bandingkan dengan setiap item ... per klausa WHERE, saya hanya peduli dengan item yang memiliki SKU "ABC123" cuaca mereka memiliki 10 seri #s atau 100. Ini sekarang akan memberi saya kemungkinan 300 atau 3000 (10 item serial @ 30 hari, atau 100 item serial @ 30 hari.
Sekarang saya memiliki "rentang" dari semua nomor seri individu dan kemungkinan hari untuk memeriksa ketersediaan, sekarang saya dapat menanyakan sistem reservasi. Jadi, melalui sub-pilihan, dan NOT IN untuk SKU yang cocok, SERIAL #, dan Tanggal MUNGKIN ditemukan dalam reservasi, saya hanya ingin menyimpannya di mana OpenDate yang diberikan TIDAK ditemukan. Saya telah mensimulasikan struktur tabel Anda dan memasukkan beberapa item, beberapa nomor seri, dan rentang tanggal reservasi, dan ini berfungsi dengan baik...
Jelas, saya akan memastikan indeks pada sku / serial untuk kinerja. Satu-satunya perubahan tambahan yang mungkin saya buat adalah saat menanyakan reservasi, untuk mengecualikan reservasi di mana tanggal akhir sebelum tanggal mulai yang dipermasalahkan untuk permintaan ANDA, dan opsional, tidak ada Tanggal Mulai> tanggal TERAKHIR yang Anda pertimbangkan. Jika Anda memiliki banyak reservasi selama bertahun-tahun, siapa yang peduli dengan sesuatu yang kuno, atau sesuatu yang jauh di masa depan dari rentang tanggal yang dimaksud.
select items.sku,
items.serial_number,
JustDates.OpenDate
from
( SELECT
@r:= date_add(@r, interval 1 day ) OpenDate
FROM
(select @r := current_date()) vars,
items limit 30 ) JustDates,
items
where
sku = "ABC123"
and sku not in ( select sku from Reservations
where items.sku = reservations.sku
and items.serial_number = reservations.serial_number
and justDates.OpenDate >= reservations.start_date
and justDates.OpenDate <= reservations.end_date )
order by
items.serial_number,
justDates.OpenDate