0

こんにちは友人私は私のウェブサイトにカスタム検索機能を持っています。検索は、 product_tableなどの2つのテーブルに依存してい ます

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`));

multiple_table

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`));

1つまたは複数のフィールドで検索するオプションをユーザーに提供しています。 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()";
}

しかし、これはいくつかの不正確で膨大な数の結果を生み出し、検索にも時間がかかりすぎます。それがなぜかわかりません。MYSQLVIEWについて聞いたことがありますが、これを行うのは意味がありますか?または、これを実現する簡単な方法はありますか?ありがとう

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 に答える