Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL PHP:如何在有限制的情况下加快select%like%逗号列表搜索?_Php_Mysql - Fatal编程技术网

MYSQL PHP:如何在有限制的情况下加快select%like%逗号列表搜索?

MYSQL PHP:如何在有限制的情况下加快select%like%逗号列表搜索?,php,mysql,Php,Mysql,如何加快%like搜索?我需要帮助。 想法1=限制, idea 2=拆分逗号关键字以分隔列 它是一个逗号分隔的关键字列表 1000个结果之后,搜索查询可以停止,以加快搜索查询(如何?) 如果我可以使用限制,我需要让搜索查询以“最佳评级产品”=“评级”开始,并在大约1000个结果后停止(如何?) 我的搜索查询:replace(b.keywords,','')像“%”“%$searchvalue.”“; 我的想法(1)是将结果限制在1000。但是我如何控制选择,以便首先搜索具有最佳评级的产品,而不会

如何加快%like搜索?我需要帮助。 想法1=限制, idea 2=拆分逗号关键字以分隔列

  • 它是一个逗号分隔的关键字列表
  • 1000个结果之后,搜索查询可以停止,以加快搜索查询(如何?)
  • 如果我可以使用限制,我需要让搜索查询以“最佳评级产品”=“评级”开始,并在大约1000个结果后停止(如何?)
  • 我的搜索查询:
    replace(b.keywords,','')像“%”“%$searchvalue.”“;
  • 我的想法(1)是将结果限制在1000。但是我如何控制选择,以便首先搜索具有最佳评级的产品,而不会错过。尽快1000(最大值)如果找到,则应停止查询。但应首先搜索评级最佳的产品,否则将错过。1000个结果后,应停止搜索查询,以加快搜索查询

    我有一个表产品。评级从0到10.000

    ID     RATING PRODUCTS   KEYWORDS
    1      1000      p1      keyword1,keyword2,...,keyword100
    ...    4         ...     ...  
    99000  200       p99000  keyword1,keyword99,...,keyword999
    
    “评级”和“关键词”(多语言)不断变化

    我的想法(2)是将每个关键字分隔在一列中。这样我就不需要前面的%$searchvalue%。但是我担心,每个产品将至少有200个额外的列,这将导致相同的搜索查询(?)。你认为呢

    ID     RATING PRODUCTS   KEYWORD1 KEYWORD2 KEYWORD3 ... KEYWORD**200** 
    1      1000      p1      red      blue     yellow   ... yellow-orange
    ...    4         ...     ...  
    99000  200       p99000  black    blue     orange   ... yellow-orange
    

    使用单独的表
    产品\u关键字

    CREATE TABLE product_keywords (
        product_id INT NOT NULL,
        keyword VARCHAR(50) NOT NULL,
        FOREIGN KEY (product_id) REFEREFENCES products (id),
        UNIQUE INDEX (product_id, keyword)
    );
    
    加入此表以查找与关键字匹配的产品

    如果您需要多语言关键字支持,可以使用关键字表的外键替换
    关键字
    ,该表可以包含多种语言的关键字

    CREATE TABLE keywords (
        id INT NOT NULL,
        language VARCHAR(10),
        keyword VARCHAR(50),
        UNIQUE KEY (id, language),
        INDEX (keyword, language)
    );
    
    CREATE TABLE product_keywords (
        product_id INT NOT NULL,
        keyword_id INT NOT NULL,
        FOREIGN KEY (product_id) REFEREFENCES products (id),
        FOREIGN KEY (keyword_id) REFERENCES keywords (id),
        UNIQUE INDEX (product_id, keyword_id)
    );
    
    然后,查询可能看起来像

    SELECT p.*
    FROM products AS p
    JOIN product_keywords AS pk ON p.id = pk.product_id
    JOIN keywords AS k on k.id = pk.keyword_id
    WHERE k.language = 'en' AND k.keyword = 'blue'
    

    首先不要使用逗号分隔的列表。规范化您的表,并为每个关键字创建一个单独的
    product_关键字
    表,每个关键字都有单独的行。遗憾的是,这些关键字每天都在变化,而且是用户生成的,而且是多语言的,它们的关键字列表太长了。英语、法语、德语、俄语……我可以创建一个关键字li仅使用英语进行st和翻译搜索查询,但翻译所有搜索查询的成本太高。:(您将如何翻译您的设计?@barmar用户生成的关键字将被选中并脱机翻译(复制粘贴)然后添加到每个产品的关键字逗号列表中。目前,英语、法语、德语、俄语、西班牙语搜索逗号分隔列表的速度非常慢,无法编制索引。我认为你的答案非常好。我可以问你如何转换当前数据库吗?首先,我必须规范逗号列表并去掉空格然后..选择关键字1..关键字2,…插入忽略..?我看了这个。它为每个关键字生成一个附加ID。查找,但找不到,1个关键字和所有ID的组合。我误解了吗?PRODUCT_ID 1,2299000您应该发布一个新问题,显示您尝试的内容和结果。我这样做了,并且:(发生了这种情况,我知道这很糟糕,我现在为什么这么做,谁在这里阻止提问?奇怪:这个问题在这里已经有答案了:在数据库列中存储分隔列表真的那么糟糕吗?(10个答案)