Database query left join mysql muncul semua

Ini query mysql ane :

ini tabel reservasi ane :

ini tabel room ane :

jadi ane pengen nampilin start_date dari form search yg bukan diantara semua start_date dan end_date yg ada di reservasi.. harusnya ada salah satu yg ga muncul, tapi malah semuanya muncul... udah googling2 jg masih blm bsa juga gatau kenapa..

help mohon pencerahannya..

avatar nanto88
@nanto88

122 Kontribusi 56 Poin

Diperbarui 7 tahun yang lalu

9 Jawaban:

kurang jelas maksudnya maksudnya gan.

misalnya search tanggalnya '2017-06-16', dari join querynya kan yang muncul room_id 4, jadi dari tabel rooms id 1,2,3, dan 5 available gitu kan? tinggal di filter lagi sama kolom city dan person yang sesuai. betul gitu?

avatar rachmatsasongko
@rachmatsasongko

410 Kontribusi 426 Poin

Dipost 7 tahun yang lalu

iyaaa betul gan seperti itu, jadi pas search tau terbooking atau ga di tanggal segitu.. ane coba2 dr stackoverflow blm bsa2

avatar nanto88
@nanto88

122 Kontribusi 56 Poin

Dipost 7 tahun yang lalu

rasanya sih sudah bener itu gan. ini saya coba simulasi di sqlfiddle http://sqlfiddle.com/#!9/f5f3b/1

urutan querynya seperti ini

-- Search '2017-06-16', 'depok', person <= 1
-- Search '2017-06-16', 'depok', person <= 2
-- Search '2017-06-29', 'depok', person <= 1
-- Search '2017-06-29', 'depok', person <= 2
-- Search '2017-06-16', 'london', person <= 1  <- blank result soalnya strict di room 4 dan person 1
-- Search '2017-06-16', 'london', person <= 2
-- Search '2017-06-29', 'london', person <= 1
-- Search '2017-06-29', 'london', person <= 2

kalo liat hasilnya sih mestinya sudah sesuai tuh

avatar rachmatsasongko
@rachmatsasongko

410 Kontribusi 426 Poin

Dipost 7 tahun yang lalu

gan @rachmatsasongko makasih banget sampe udh buat simulasinya.. kaya penjawab stackoverflow *sungkem*

ini relasinya one to many kan gan ? ane harus definisiin relasinya gtu dari laravel di modelnya terus klo misal ditambahin query AND lg di dalam where left outer join seperti ini bisa ga gan :



("
                            SELECT
                      *
                      FROM
                      rooms
                      WHERE
                      id NOT IN (
                           SELECT
                               rooms.id
                           FROM
                               rooms
                           LEFT OUTER JOIN
                               reservations ON reservations.room_id = rooms.id
                           WHERE
                          $request->start_date BETWEEN reservations.start_date AND reservations.end_date
                          AND
                          $request->end_date BETWEEN reservations.start_date AND reservations.end_date

                         )
                      AND
                      city LIKE '%$request->city%'
                      AND
                      person <= $request->person
                      ORDER BY
                      rooms.updated_at
                      asc
      ");

ane coba yg keluar semua roomnya, jadi seperti ini.. get nya padahal udah gini.. [img]http://i65.tinypic.com/ekf8ub.png[/img]

ane coba lagi kasusnya ane langsung masukan nilainya tanpa request.. eh ternyata bisa, [img]http://i66.tinypic.com/2m5xulf.png[/img]

yg keluar kamar depok (harusnya ada 2, tapi yg 1nya di tanggal 29 lg terbooking) [img]http://i63.tinypic.com/jg72wi.png[/img]

nah ane coba pake request yg start_date nya aja, [img]http://i65.tinypic.com/j13j40.png[/img]

eh yg muncul 2, padahal asdasd lg terbooking di tgl 29 [img]http://i64.tinypic.com/21ag60m.png[/img]

ane coba dd($request->start_date); isinya udah benar.. btw ane pakai type"text" di view htmlnya, bisa kan gan ?

sebelumnya makasih banget gan @rachmatsasongko

avatar nanto88
@nanto88

122 Kontribusi 56 Poin

Dipost 7 tahun yang lalu

Jawaban Terpilih

mm, mungkin karena masalah quote dan double quote. coba jangan di inject langsung request paramnya ke query tapi pake binding.

$room = DB::select('
SELECT
*
FROM
rooms
WHERE
id NOT IN (
   SELECT
      rooms.id
   FROM
      rooms
   LEFT OUTER JOIN
      reservations ON reservations.room_id = rooms.id
   WHERE
      :start_date BETWEEN reservations.start_date AND reservations.end_date
   AND
      :end_date BETWEEN reservations.start_date AND reservations.end_date

)
AND
city LIKE :city
AND
person <= :person
ORDER BY
rooms.updated_at
asc', ['start_date' => $request->start_date, 'end_date' => $request->end_date, 'city' => '%$request->city%', 'person' => $request->person]);

avatar rachmatsasongko
@rachmatsasongko

410 Kontribusi 426 Poin

Dipost 7 tahun yang lalu

ane udah ikuti sesuai ni gan, ada yg salah ga.. btw untuk between kan ada AND, terus di where tersebut kita panggil AND lagi itu bisa kan tapi ya ? [img] http://i.imgur.com/wVu3Lu8.png [/img] [img] http://i.imgur.com/5MmnYHD.png [/img]

ane coba 3 kondisi hasilnya jadi kosong semua kenapa y.. [img] http://i.imgur.com/UPj1AzZ.png [/img]

btw makasih banget gan @rachmatsasongko , bantu terus ane y gan plissss ane bakal ikuti saran apa aja dari agan..

avatar nanto88
@nanto88

122 Kontribusi 56 Poin

Dipost 7 tahun yang lalu

bener berarti masalah binding variabel. yang jadi masalah pasti params city. coba ganti 'city' => '%$request->city%' sama

'city' => "%$request->city%"   <-- pakai double quote

atau ga usah pakai like operator sekalian, tapi hasil searchnya jadi exact

'city' => $request->city

avatar rachmatsasongko
@rachmatsasongko

410 Kontribusi 426 Poin

Dipost 7 tahun yang lalu

WAAAAOOOOOWWWWWWWW BISAAA NIHHH ane coba beberapa kondisi didalam tgl nya dan search yg keluar sesuai yg ane inginkan makasih bangettt mass satu inii @rachmatsasongko makasih banyakk massss terus jawabin untuk sekolah koding yaaaa

avatar nanto88
@nanto88

122 Kontribusi 56 Poin

Dipost 7 tahun yang lalu

sip, sama2 :)

avatar rachmatsasongko
@rachmatsasongko

410 Kontribusi 426 Poin

Dipost 7 tahun yang lalu

Login untuk ikut Jawaban