情景描述:想做一个有关房产的网页的搜索限定。
前台表单是,多种复选框,checkbox类型的。之间的关系是逻辑or的关系。
比如<input type="checkbox" value="type_id" name="type" />这个是一个房屋类型的设置,对应的value是一个房屋类型的表,如下表名:type
字段1,type_id:1,type_name:多层
字段1,type_id:2,type_name:高层
字段1,type_id:3,type_name:小高层类似上面的条件还有很多比如房屋样式表啊之类的,
当然我还有一个house的主表,因为对应的house_type是checkbox存的,一般都是字符串,eg(1@3),表示这个楼盘包括多层和小高层。那么请问我在做这个查询分类的时候如何写我的sql条件。如何查询有多层或者小高层类型的?
如果是select框的时候,我可以这样写  
select * from house where house_type in (1,2)&......这里的(1,2)是我前台勾选的checkbox,而我的存的应该是单一的值,1或者2,不会出现字符串的拼接。现在问题就是house_type是字符串类型的,如何写这样的一个查询条件?sql语句?

解决方案 »

  1.   


    <input type="checkbox" value="type_id" name="type" />
    改成:
    <input type="checkbox" value="type_id1" name="type_id[]" />
    <input type="checkbox" value="type_id2" name="type_id[]" />
    ....
    这样post之后传递过来的就是一个数组
    $type_id_str='';
    $query=" 1 ";
    if(!empty($_POST['type_id']))
    {
        $type_id_str=implode(',',$_POST['type_id']);
        $query.=" AND house_type in (".$type_id_str.")";
    }
    $sql="select * from house where ".$query;
      

  2.   

    不能这样匹配
    我看懂你的了,你对$_POST[type_id]进行处理,使之和我的house_type类型匹配。然后在用in来进行组合但是你忽略了一个重要的问题,好像。当前台勾选 高层,小高层 的时候,用户希望得到的结果是,具有小高层or(这个or很关键)或者高层的楼盘。反观数据库的设计,如果楼盘A中的house_type是1@2@3,应该在前台用户满足用户勾选(小高层,高层)的这个条件。可是按照你的sql语句,明显,“1@2@3”是不能和“2@3”匹配的,所以查询不到想要的结果。问题主要存在我的这个house_type中。。他是一个字符串怎么办
      

  3.   

    house 和type存在一对多的关系,建一个映射表,如
    house_id     house_type
    1001        1
    1001        3
    然后select a.house_id,a.house_type,b.house_type from map a left join map b on a.house_id=b.house_id 
    where a.house_type = 1 and b.house_type = 3
    貌似比lz的还麻烦。。
    直接定义一个type_id为4的,typename为多层+小高层,不知可行不。
      

  4.   

    如果存的是1@2@3@4,这种要取1和3,或者1和3,貌似只能用LIKE。
      

  5.   


    这倒是一个可以解决的方法,可问题是,这样的checkbox,太多,都这样一对多,是不是略显麻烦,house主表,映射表,type信息表
      

  6.   


    看来还是要用like进行sql中where语句的堆叠了我试下。。
      

  7.   

    前台的代码html<form action="" name="search_form" method="post">
    <table>
    <tr>
    <td>物业类型;</td>
    <td><?php foreach ($info_type as $value_type) echo "<input type='checkbox' value='".$value_type[wuyeid]."' name='cb_type[]'>".$value_type[name];?></td>
    </tr>
    <tr>
    <td><input type="submit" name="search" value="search"></td>
    </tr>
    </table>
    </form>
    php代码$info_type=$this->house_type->select();
    if($_POST[search]){
    //var_dump($_POST);
    foreach ($_POST[cb_type] as $v_type) $str_type.=$v_type."@";
    // var_dump($str_type);
    $where.="wuyelx LIKE '%$str_type%'";
    //这里显然是不行的,因为"1@2"和"2@3"也是不匹配的。但是按道理,结果应该有这个楼盘的。
    $result=$this->house_db->listinfo($where);
    // var_dump($result);
    //这是在phpcms中改得一部分。
    }
    include template('house', 'house_search');