Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

MySQL memilih baris di mana tanggal bukan di antara tanggal

Dengan asumsi Anda tertarik untuk menempatkan @Guests dari @StartDate ke @EndDate

SELECT DISTINCT r.id, 
FROM room r 
     LEFT JOIN roombooking_room rbr ON r.id = rbr.room_id
     LEFT JOIN roombooking ON rbr.roombooking_id = rb.id
WHERE COALESCE(@StartDate NOT BETWEEN rb.startDate AND rb.endDate, TRUE)
      AND COALESCE(@EndDate NOT BETWEEN rb.startDate AND rb.endDate, TRUE)
      AND @Guests < r.maxGuests

harus memberi Anda daftar semua kamar yang gratis dan dapat menampung jumlah tamu tertentu selama periode tertentu.

CATATAN
Kueri ini hanya berfungsi untuk satu kamar, jika Anda ingin melihat beberapa kamar, Anda perlu menerapkan kriteria yang sama untuk kombinasi kamar. Untuk ini, Anda akan memerlukan kueri rekursif atau beberapa tabel pembantu. Juga, COALESCE ada untuk menangani NULL - jika kamar tidak dipesan sama sekali, itu tidak akan memiliki catatan dengan tanggal untuk dibandingkan, sehingga tidak akan kembali sepenuhnya gratis kamar. Tanggal antara date1 dan date2 akan mengembalikan NULL jika date1 atau date2 adalah null dan penggabungan akan mengubahnya menjadi true (alternatifnya adalah melakukan UNION kamar yang sepenuhnya gratis; yang mungkin lebih cepat).

Dengan banyak ruangan, semuanya menjadi sangat menarik. Apakah skenario itu bagian besar dari masalah Anda? Dan database mana yang Anda gunakan yaitu apakah Anda memiliki akses ke kueri rekursif?

EDIT

Seperti yang saya nyatakan beberapa kali sebelumnya, cara Anda mencari solusi (algoritma serakah yang melihat kamar gratis terbesar terlebih dahulu) tidak optimal jika Anda ingin mendapatkan yang paling sesuai antara jumlah tamu dan kamar yang dibutuhkan.

Jadi, jika Anda mengganti foreach Anda dengan

$bestCapacity = 0;
$bestSolution = array();

for ($i = 1; $i <= pow(2,sizeof($result))-1; $i++) {
    $solutionIdx = $i;
    $solutionGuests = 0;
    $solution = array();
    $j = 0;
    while ($solutionIdx > 0) :
        if ($solutionIdx % 2 == 1) {
            $solution[] = $result[$j]['id'];
            $solutionGuests += $result[$j]['maxGuests'];
        }
        $solutionIdx = intval($solutionIdx/2);
        $j++;
    endwhile;       
    if (($solutionGuests <= $bestCapacity || $bestCapacity == 0) && $solutionGuests >= $noGuests) {
        $bestCapacity = $solutionGuests;
        $bestSolution = $solution;
    }
}

print_r($bestSolution);
print_r($bestCapacity);

Akan melalui semua kemungkinan kombinasi dan temukan solusi yang menghabiskan paling sedikit ruang.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP &MYSQL:menggunakan hash bcrypt dan memverifikasi kata sandi dengan database

  2. Dalam SQL / MySQL, apa perbedaan antara ON dan WHERE dalam pernyataan bergabung?

  3. Cara membuat MySQL menangani UTF-8 dengan benar

  4. Secara otomatis menambahkan huruf di depan bidang kenaikan otomatis

  5. Perbarui peringkat di Tabel MySQL