代码之家  ›  专栏  ›  技术社区  ›  sinuhepop

MySQL存储过程:搜索数量可变的字符串

  •  4
  • sinuhepop  · 技术社区  · 15 年前

    我需要一个存储过程,调用如下:

    search('foo bar')
    

    搜索类似于:

    SELECT FROM A, B
    WHERE A.B_ID = B.ID
    AND (A.f1 LIKE '%foo%' OR A.f2 LIKE '%foo%' OR B.f3 LIKE '%foo%')
    AND (A.f1 LIKE '%bar%' OR A.f2 LIKE '%bar%' OR B.f3 LIKE '%bar%')
    

    我有一些疑问:

    1. 我无法将数组传递给过程,因此我唯一的选择是直接传递字符串,如示例('foo bar')?

    2. this solution . 正在使用临时表和我认为非常笨拙的代码。真的这么复杂吗?表演怎么样?

    3. 我不知道如何创建这样的动态查询。我想我必须循环令牌,为每个人创建一个WHERE子句的新块,但我不确定如何做到这一点,或者它是否是最佳的解决方案。也许连接字符串然后生成一个准备好的语句更好?

    谢谢。

    注意:我使用iBATIS(Java)来调用这个例程。

    1 回复  |  直到 15 年前
        1
  •  3
  •   OMG Ponies    15 年前

    您想要的是使用全文搜索(FTS)——MySQL的原生FTS功能只能在MyISAM表上使用,还有第三方FTS(如Sphinx)可供选择。这里是 an online slideshow that's a decent intro & howto

    使用MySQL原生FTS,您的查询类似于:

    SELECT *
      FROM A AS a
      JOIN B AS b ON b.id = a.b_id
     WHERE MATCH (a.f1, a.f2, b.f3) AGAINST ('foo bar');
    

    动态SQL仍然是一个选项,这取决于您希望/需要查询的强度。在考虑动态SQL之前,我会先研究FTS产品。。。

    推荐文章