Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.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
Php 对两个表进行模糊匹配选择查询_Php_Mysql_Sql - Fatal编程技术网

Php 对两个表进行模糊匹配选择查询

Php 对两个表进行模糊匹配选择查询,php,mysql,sql,Php,Mysql,Sql,我有两张表——“品牌”和“手机”,如下面的sqlfiddle所示 我基本上想知道如何最好地实现一个搜索,该搜索将执行以下操作-如果用户输入“Sony Ericcson”-它将显示该品牌的所有手机。。然而,如果他们输入搜索词“Sony Ericsson Xperia”,它将足够聪明,可以做一个类似的操作,并检索一部名为“Xperia P”的手机 我能理解其中的逻辑——只是试图找到最佳的优化方法,以最小的数据库占用空间来实现这一点 我的伪代码如下所示: 从搜索关键字中对品牌表执行类似查询(例如索尼

我有两张表——“品牌”和“手机”,如下面的sqlfiddle所示

我基本上想知道如何最好地实现一个搜索,该搜索将执行以下操作-如果用户输入“Sony Ericcson”-它将显示该品牌的所有手机。。然而,如果他们输入搜索词“Sony Ericsson Xperia”,它将足够聪明,可以做一个类似的操作,并检索一部名为“Xperia P”的手机

我能理解其中的逻辑——只是试图找到最佳的优化方法,以最小的数据库占用空间来实现这一点

我的伪代码如下所示:

  • 从搜索关键字中对品牌表执行类似查询(例如索尼)
  • 如果找到匹配项,则显示该品牌的所有手机(例如Xperia P、W500)
  • 如果用户输入“Sony Ericsson Xperia”-我们希望从查询中删除“Sony Ericsson”,只需在“Xperia”上执行类似查询并返回“Xperia P”

  • 有人能推荐最优化的方法吗?

    也许你应该像这样使用全文搜索

        select * from brands b join phones p
        on p.brand_id = b.id
        where match (b.brand, p.phone)
        against ('sony ericsson xperia' IN BOOLEAN MODE)
    
    但它只在myIsam引擎中工作(:


    也许你应该像这样使用全文搜索

        select * from brands b join phones p
        on p.brand_id = b.id
        where match (b.brand, p.phone)
        against ('sony ericsson xperia' IN BOOLEAN MODE)
    
    但它只在myIsam引擎中工作(:


    您可能需要加入。请尝试以下操作:​

    SELECT phones.id, phones.phone, brands.id, brands.brand 
    FROM brands, phones  
    WHERE brands.brand LIKE 'Sony Ericsson' AND brands.id = phones.brand_id;
    

    您可以随时使用或来调整上述内容,以搜索电话名。

    您可能需要加入。请尝试以下操作:​

    SELECT phones.id, phones.phone, brands.id, brands.brand 
    FROM brands, phones  
    WHERE brands.brand LIKE 'Sony Ericsson' AND brands.id = phones.brand_id;
    
    您也可以随时使用或来调整上述参数,以搜索电话名。

    基本上按照建议使用了以下方法-请参阅SQLFIDLE并使用另一个表来执行与phones表id链接的查询。我希望这是有意义的:-)再次感谢


    基本上按照建议使用了以下方法-查看sqlfiddle并使用另一个表来执行与phones表id链接的查询。我希望这是有意义的:-)再次感谢

    最简单的方法是将两个表连接起来并连接品牌名称和电话名称。然后匹配此连接字符串:

    select *
    from brands
    join phones on (phones.brand_id = brands.id)
    where concat(brands.brand, ' ', phones.phone) like concat('your search string here','%')
    

    这符合你的要求。尽管如此,请注意,这仍然是一个非常糟糕的搜索引擎。搜索字符串必须完全匹配。'索尼有,“索尼爱立信”有,“索尼爱立信Xperia”有,甚至“索尼E”也有,但“SonyEricsson”(两个空格)没有,而“索尼Xperia”也没有。

    最简单的方法是加入两个表格,并将品牌名和电话名连接起来。然后匹配此连接字符串:

    select *
    from brands
    join phones on (phones.brand_id = brands.id)
    where concat(brands.brand, ' ', phones.phone) like concat('your search string here','%')
    


    这符合你的要求。尽管如此,请注意,这仍然是一个非常糟糕的搜索引擎。搜索字符串必须完全匹配。'索尼“有”,“索尼爱立信”有,“索尼爱立信Xperia”有,甚至“索尼E”也有,但“SonyEricsson”(两个空格)没有,而“索尼Xperia”也没有。

    这个问题相当“不寻常”。尽管市场上大肆宣传,但电脑并不“聪明”。事实上,他们非常愚蠢,不容易注意到隐含的模式(即,我认为从“索尼爱立信Xperia”派生“Xperia P”需要一个非常好的算法,从手机中选择P.phone P内部加入品牌b on(P.brand_id=b.id),其中b.brand=“索尼爱立信”和类似于P.phone的“%Xperia%”@STTLCU我有一个brand_id,它是phones表中链接到brands表的外键。不过,算法应该考虑到有很多单词,它们可能是随机排列的(比如“Iphone apple 5s gold”的结果是什么?)“你是在寻找……”算法是多年研究的结果吗?)根据项目的规模,你可能想考虑用这个问题进行全文搜索是非常“不平凡”的。尽管市场炒作,计算机并不是“聪明”的。事实上,它们很笨拙,不容易察觉隐含的模式。(也就是说,我认为从“索尼爱立信Xperia”中导出“Xperia P”需要一个非常好的算法,从手机中选择P.phone P内部连接品牌b on(P.brand_id=b.id),其中b.brand=“索尼爱立信”和类似于P.phone的“%Xperia%“@STTLCU我有一个brand_id,它是phones表中链接到brands表的外键。不过,算法应该考虑到有很多单词,它们可能是随机排列的(比如“Iphone-apple 5s-gold”的结果是什么?)或者相互冲突或拼写错误,或者其他什么。谷歌的“你是在寻找……”算法是多年研究的结果吗?)根据项目的规模,你可能想考虑全文搜索,只记得在字段上添加FultLeXT索引;即使他使用InnoDB,他也可以创建一个单独的MyIsam表,其中包含文本数据和相关id。我认为这可能是一种方法。我来试一试,看看我能做些什么,我应该为品牌和手机再做两个表-称它们为品牌\全文,电话\全文-使用与品牌和电话表相同的字段,但将其更改为MyISAM并在可搜索的字段(在本例中为品牌名称和电话名称)上添加全文。只需将其更改为MyISAM并添加全文索引即可,但您将丢失它们之间的外键约束,在其他情况下,您可以在InnoDb中添加一个表来创建它们之间的关系p.s抱歉,我的英语很差(:只需记住在字段上添加全文索引;)即使他使用InnoDB,他也可以创建一个单独的MyIsam表,其中包含文本数据和相关id。我认为这可能是一种方法。我来试一试,看看我能做些什么,我应该为品牌和手机再做两个表-称它们为品牌\全文,电话\全文-使用与品牌和电话表相同的字段,但将其更改为MyISAM并在可搜索的字段(在本例中为品牌名称和电话名称)上放置全文。可以将其更改为MyISAM并放置全文索引,但您将丢失外键