0

嗨朋友们,我在我的网站上有一个自定义搜索功能。搜索取决于两个表,例如 product_table

CREATE TABLE `product_table` (
 `product_id` int(11) NOT NULL auto_increment,
 `product_name` varchar(100) NOT NULL,
 `country` varchar(200) NOT NULL,
 `added_time` timestamp NOT NULL default CURRENT_TIMESTAMP,
 PRIMARY KEY  (`product_id`));

多个表

CREATE TABLE `multiple_table` (
 `multi_id` int(11) NOT NULL auto_increment,
 `cat_id` int(11) NOT NULL,
 `product_id` int(11) NOT NULL,
 PRIMARY KEY  (`multi_id`));

我正在为用户提供按一个或多个字段进行搜索的选项 product_name,country,cat_id,added_time

我的搜索功能如下,

if(isset($_GET['s_button'])){
$sql2="SELECT a.product_id FROM product_table a, multiple_table b WHERE b.product_id= a.product_id ";
$where=array();
$values = array();
$types = '';
if(!empty($_GET['search_cat'])){
$search_cat=clean($_GET['search_cat']);
$where[]="AND cat_id='".$search_cat."'";
}
if(!empty($_GET['product_country'])){
$country=clean($_GET['product_country']);
$where[]="AND country='".$country."'";
}
if(!empty($_GET['model'])){
$keyword=clean($_GET['model']);
$where[]="AND product_name LIKE '%".$keyword."%'";
}
$sql2 .= implode($where). " ORDER BY a.product_id ";
}else{
$sql2 = "SELECT product_id FROM product_table ORDER BY Rand()";
}

但这会产生一些不正确和大量的结果,而且搜索也需要太多时间。我不知道为什么会这样。我听说过 MYSQL VIEWs 这样做有什么意义吗?或者我有什么简单的方法可以做到这一点?谢谢

4

2 回答 2

1

你应该这样尝试:

SELECT a.product_id FROM product_table a INNER JOIN multiple_table b ON b.product_id= a.product_id
于 2012-09-27T03:11:54.837 回答
0

考虑类似的事情:

<?php
if(isset($_GET['s_button'])){
    $options = array(
        (object)array(
            "get_key"=>"search_cat",
            "table_key"=>"cat_id"
        ),
        (object)array(
            "get_key"=>"product_country",
            "table_key"=>"country"
        ),
        (object)array(
            "get_key"=>"model",
            "table_key"=>"product_name",
            "compare"=>"LIKE"
        )
    );
    $parseOptions = function($element){
        $defaults = array("wildcards"=>"both");
        $settings = (object)array_merge($defaults, (array)$element);
        if(isset($_GET[$settings->get_key]) && strlen($_GET[$settings->get_key])>0){
            $search = mysql_real_escape_string($_GET[$settings->get_key]);
            switch($settings->compare){
                default:
                    return $settings->table_key."='$search'";
                    break;
                case 'LIKE':
                    switch($settings->wildcards){
                        case 'both':
                            return $settings->table_key." LIKE '%$search%'";
                            break;
                    }
            }
        }
    };
    $where = array_map($parseOptions, $options);
    $sql2="SELECT
        products.product_id
        FROM product_table AS products
        LEFT JOIN multiple_table AS multi
            ON products.product_id = multi.product_id";

    if(count($where)>0) $sql2 .= " WHERE ".implode(" AND ",$where);
    $sql2 .= " ORDER BY product_id ";
}else{
    $sql2 = "SELECT product_id FROM product_table ORDER BY Rand()";
}

扩展起来会更容易。

于 2012-09-27T03:52:58.213 回答