我需要一个数组并将其用于MySQL查询。
我尝试寻找方法,但所有方法似乎都与PHP数组有关,而不是Ruby。
例如,我有terms = ['genetics', 'elderly', 'health']
,我想使用:
con.query "SELECT col1 FROM data1 WHERE MATCH (col2) AGAINST (terms)"
这可能吗?
答案 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%'))