【问题标题】:Codeigniter - select where id not in (another query result)Codeigniter - 选择 id 不在的位置(另一个查询结果)
【发布时间】:2016-10-25 04:22:09
【问题描述】:

我正在研究酒店预订系统,目前我正在尝试选择可用房间(未预订)。

Rooms DB Structure:
ID
ROOM NAME
CAPACITY

HOTEL RESERVATIONS DB STRUCTURE:
ID
CHECK_IN
CHECK_OUT
ROOMS
...

这是我当前的代码:

function searchFreeRooms($data){
  $check_in = $data['fields']['check_in'];
  $check_out = $data['fields']['check_out'];
  $this->db->select("*");
  $this->db->from('core_hotel_rooms');
  $this->db->where("id NOT IN (select rooms,total_guests from res_hotel where check_in <= '$check_in' AND check_out >= '$check_in' OR check_in <= '$check_out' AND check_out >= '$check_out' OR check_in >= '$check_in' AND check_out <= '$check_out' ) ");
  $query = $this->db->get();
  return $query->result();
 }

用户一次可以预订多个房间,预订的房间ID存储在“ROOMS”列中,以逗号分隔,例如:2、3、5

在我的前面,不应显示此列中存在的房间,但我遇到了麻烦,因为只选择了逗号之前的第一个 id(room),例如:2,3,5 > 仅选择了 2 和 3, 5仍然显示在我的前面。

问题在这里:$this-&gt;db-&gt;where("id NOT IN (select rooms,total_guests from res_hotel where check_in &lt;= '$check_in' AND check_out &gt;= '$check_in' OR check_in &lt;= '$check_out' AND check_out &gt;= '$check_out' OR check_in &gt;= '$check_in' AND check_out &lt;= '$check_out' ) ");

我试过这个:$this-&gt;db-&gt;where("id NOT IN (1, 2) ");,它工作得很好,但不是第二个查询的上层方法。

对不起我的英语......

非常感谢所有可以提供帮助的人!

【问题讨论】:

    标签: php mysql codeigniter


    【解决方案1】:

    终于在你们的帮助下,我解决了我的问题!

    工作代码:

    function searchFreeRooms($data){
      $check_in = $data['fields']['check_in'];
      $check_out = $data['fields']['check_out'];
      $query1 = $this->db->query("select rooms from res_hotel where (check_in <= '$check_in' AND check_out >= '$check_in') OR (check_in <= '$check_out' AND check_out >= '$check_out') OR (check_in >= '$check_in' AND check_out <= '$check_out' )");
      $query1_result = $query1->result();
      $room_id= array();
      foreach($query1_result as $row){
         $room_id[] = $row->rooms;
       }
      $room = implode(",",$room_id);
      $ids = explode(",", $room);
      $this->db->select("*");
      $this->db->from('core_hotel_rooms');
      $this->db->where_not_in('id', $ids);
      $query = $this->db->get();
      return $query->result();
     }
    

    非常感谢!

    【讨论】:

      【解决方案2】:
      $result = $this->db->select('room')
           ->get('your_table');
      
          foreach($result as $item) {
              $array[] = $item['id'];         
          }
          $a = implode(',', $array);
      
      $this->where_not_in('id', $a);
      

      做这样的事情。

      【讨论】:

      • implode 实际上是不必要的,因为where_not_in 可以直接获取一个数组。
      • 我曾经尝试用数组来做,但我得到了“数组到字符串转换”的错误。你能把你所说的代码提供给我吗!
      • $this-&gt;where_not_in('id', $array) 据我所知工作正常
      【解决方案3】:

      这是您的问题的解决方案。希望对您有所帮助:

      function searchFreeRooms($data){
        $check_in = $data['fields']['check_in'];
        $check_out = $data['fields']['check_out'];
      
        $query1 = $this->db->query("select rooms from res_hotel where check_in <= '".$check_in."' AND check_out >= '".$check_in."' OR check_in <= '".$check_out."' AND check_out >= '".$check_out."' OR check_in >= '".$check_in."' AND check_out <= '".$check_out."'")->result_array();
        $room_id= array();
        foreach($query1 as $row){
           $room_id[] = $row->rooms;
         }
        $room = implode(",",$room_id);
      
        $query = $this->db->query("select * from rooms where id not in (".$room.")");
      
            return $query->result();
           }
      

      【讨论】:

        【解决方案4】:

        考虑使用括号

           $this->db->where("id NOT IN (select rooms,total_guests from res_hotel where (check_in <= '$check_in' AND check_out >= '$check_in') OR (check_in <= '$check_out' AND check_out >= '$check_out') OR (check_in >= '$check_in' AND check_out <= '$check_out' ) ) ");
        

        【讨论】:

        • 在 phpmyadmin 中使用所有值运行第二个查询
        • 不工作!我在 phpmyadmin select * from core_hotel_rooms where id not in (select rooms from res_hotel where check_in &lt;= '2016-06-24' AND check_out &gt;= '2016-06-24' OR check_in &lt;= '2016-06-30' AND check_out &gt;= '2016-06-30' OR check_in &gt;= '2016-06-24' AND check_out &lt;= '2016-06-30') 中进行了此查询,它向我显示了这些结果: id: 1,2,4,5,这是错误的! id: 4 也应该从这里删除,因为我在房间列中有这个值:3、4。当我运行第二个查询时,只有结果是正确的值:3,4。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-10-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多