Pekerjaan saya adalah untuk sistem janji temu: Saya memiliki dua tabel:

Times(hour varchar);
Reservations(time varchar, date varchar);

Tabel waktu memiliki semua waktu toko buka (sebagai string) dari 8 hingga 6 sore (08:00,08:30,09:00, dll.) Reservasi memiliki waktu yang dipesan. Toko memiliki 3 karyawan yang dapat melakukan janji temu secara bersamaan, sehingga 3 klien dapat memesan pada pukul 10:00 pagi per contoh.

Tujuan saya adalah mengembalikan daftar waktu yang tidak dipesan tetapi dengan satu syarat: Jika waktu telah dipesan kurang dari 3 kali, itu masih dapat dipesan. Saya mencoba kueri ini

SELECT `hour` FROM `times` WHERE `hour` NOT IN (SELECT `time` FROM `reservations` WHERE `date` = '$date' HAVING COUNT(`time`)>=3);

Masalahnya adalah ini mengembalikan nol jika tidak ada waktu yang dicadangkan, tetapi saya tidak mengerti mengapa .. Jika subquery mengembalikan nol, kueri pertama yang tidak ada di subquery (null) harus kembali sepanjang waktu di tabel Times kan? Ini memberi saya baris kosong ... Ada yang tahu kenapa?

0
Elio Rahy 1 Februari 2020, 01:26

2 jawaban

Jawaban Terbaik

Kueri ini:

SELECT `time` 
FROM `reservations` 
WHERE `date` = '$date' 
GROUP BY `time`
HAVING COUNT(*) >= 3

Mengembalikan daftar waktu yang dipesan berdasarkan kondisi Anda.
Jadi gunakan LEFT JOIN dari Times ke kueri itu dan kembalikan hanya baris yang tidak cocok:

SELECT t.`hour` 
FROM `times` t LEFT JOIN (
    SELECT `time` 
    FROM `reservations` 
    WHERE `date` = '$date' 
    GROUP BY `time`
    HAVING COUNT(*) >= 3
) r on r.time = t.`hour`
WHERE r.time IS NULL
2
forpas 31 Januari 2020, 22:35

Jika subquery mengembalikan null, maka operator IN akan selalu memberi Anda null sebagai hasilnya. Jika Anda ingin mendapatkan hasil, pastikan Anda tidak memiliki nol di subquery atau membuat subquery mengembalikan set kosong. Saya mencobanya di SQL server.

0
Maris Mols 31 Januari 2020, 22:37