如何使用数组创建MySQL查询?

时间:2013-07-01 20:21:45

标签: mysql ruby arrays

我需要一个数组并将其用于MySQL查询。

我尝试寻找方法,但所有方法似乎都与PHP数组有关,而不是Ruby。

例如,我有terms = ['genetics', 'elderly', 'health'],我想使用:

con.query "SELECT col1 FROM data1 WHERE MATCH (col2) AGAINST (terms)"

这可能吗?

2 个答案:

答案 0 :(得分:0)

您可以在join条款中against {/ 1}}条款:

terms = ['genetics' , 'elderly', 'health']
con.query "SELECT col1 FROM data1 WHERE MATCH col2 AGAINST ('#{terms.join(' ')}')"

请注意,使用match/against几乎肯定会比使用一系列like子句更具表现力。有关详细信息,请参阅此StackOverflow答案:Which SQL query is better, MATCH AGAINST or LIKE?

查看MySQL文档以获取有关全文搜索的更多信息(包括可能的运算符):http://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html

答案 1 :(得分:0)

我强烈建议您查看一个ORM,例如Sequel,这样可以非常轻松地以DBM独立方式生成正确的查询。

它允许我们方便地使用数组和散列。这里是an example使用数组在SQL中生成“where”子句:

my_posts = posts.where(:category => ['ruby', 'postgres', 'linux'])
# WHERE category IN ('ruby', 'postgres', 'linux')

该特定示例是“过滤记录”部分的一部分。

在评论中,OP说:

  

col2是文本,每行都有一个段落,而不只是一个单词。

然后你想要一个允许测试每个单词的LIKE或正则表达式。有关Sequel如何在字符串内搜索,请参阅“数据集过滤”的“String search functions”部分。

代码如下:

data1.select(:col1).where(Sequel.like(:col2, terms.map{ |t| "%#{ t }%" } ))

会生成如下内容:

SELECT col1 FROM data1 WHERE ((col2 LIKE '%genetics%') OR (col2 LIKE '%elderly%') OR (col2 LIKE '%health%'))