【问题标题】:SQL where condition in CodeigniterCodeigniter 中的 SQL where 条件
【发布时间】:2017-11-13 12:34:34
【问题描述】:

我想检查是否存在预订。我有入住日期、退房日期和房间号。我尝试了以下查询,但它也提供了所有不属于该房间 ID 的数据。我做错了什么?

$array = array('checkin_date' => $checkin, 'checkout_date' => $checkin);
$array1 = array('checkin_date >' => $checkin, 'checkout_date <' => $checkin);
$array2 = array('checkin_date <' => $checkin, 'checkout_date >' => $checkin);
$array3 = array('checkin_date <' => $checkin, 'checkout_date <' => $checkin);
$array4 = array('checkin_date >=' => $checkin, 'checkout_date <=' => $checkin);
$array5 = array('checkin_date >=' => $checkout, 'checkout_date <=' => $checkout);

$this->db->select('*');
$this->db->from('igc_room_booking');
$this->db->where('delete_status', 0);
$this->db->where('cancel_status', 0);
$this->db->where('room_id', $val->room_id);
$this->db->where($array);
$this->db->or_where($array2);
$this->db->or_where($array3);
$this->db->or_where($array);
$this->db->or_where($array4);
$this->db->or_where($array5);
$bookingss = $this->db->get()->result();

【问题讨论】:

  • 什么是$val
  • 你应该回显你的查询并在 phpmyadmin 上检查它
  • 您使用的是什么 SQL 版本?你把事情复杂化了,可能在一种情况下就足够了。

标签: php sql codeigniter


【解决方案1】:

现在我没有在这里考虑你的逻辑 - 因为 Simos Fasouliotis 在 cmets 中说得够多了 - 所以你在句法上得到了一个正确的想法......

但是,如果您使用 get_compiled_select 编译查询,则会得到以下结果:

SELECT *
FROM `igc_room_booking`
WHERE `delete_status` =0
AND `cancel_status` =0
AND `room_id` = 12
AND `checkin_date` = '2010-09-01'
AND `checkout_date` = '2010-09-01'
OR `checkin_date` < '2010-09-01'
OR `checkout_date` > '2010-09-01'
OR `checkin_date` < '2010-09-01'
OR `checkout_date` < '2010-09-01'
OR `checkin_date` = '2010-09-01'
OR `checkout_date` = '2010-09-01'
OR `checkin_date` >= '2010-09-01'
OR `checkout_date` <= '2010-09-01'
OR `checkin_date` >= '2010-10-01'
OR `checkout_date` <= '2010-10-01'

现在你应该能够理解问题所在了......

可能的解决方案是

$bookingss = $this->db
    ->select('*')
    ->from('igc_room_booking')
    ->where('delete_status', 0)
    ->where('cancel_status', 0)
    ->where('room_id', $val->room_id)
    ->group_start()
        ->or_where($array)
        ->or_where($array2)
        ->or_where($array3)
        ->or_where($array4)
        ->or_where($array5)
    ->group_end()
    ->get()
    ->result();

但是恕我直言,这没有任何意义,您应该清楚地考虑您需要哪个日期范围...

【讨论】:

    【解决方案2】:

    试试这个:

    $array = "('$checkindate' BETWEEN `checkin_date` AND `checkout_date`) OR  ('$checkoutdate' BETWEEN `checkin_date` AND `checkout_date`) OR (`checkin_date` > '$checkindate' AND `checkout_date` < '$checkoutdate')";
        $this->db->select('*');
        $this->db->from('igc_room_booking');
        $this->db->where('delete_status', 0);
        $this->db->where('cancel_status', 0);
        $this->db->where('room_id', $val->room_id);
        $this->db->where($array);
        $bookingss = $this->db->get()->result();
    

    【讨论】:

      【解决方案3】:

      我认为问题在于你的查询是错误的......你应该删除

      $this->db->select(*) 和 $this->db->from('igc_room_booking')


      而在你所有的 where 子句之后,你应该有

      $this->db->get('igc_room_booking');

      【讨论】:

        猜你喜欢
        • 2012-12-11
        • 2012-05-19
        • 2013-03-30
        • 1970-01-01
        • 1970-01-01
        • 2017-12-19
        • 2010-09-26
        • 2023-03-07
        • 1970-01-01
        相关资源
        最近更新 更多