我需要获取一个数组并将其用于 MySQL 查询。
我尝试寻找方法,但它们似乎都与 PHP 数组有关,而不是 Ruby。
例如,我有terms = ['genetics', 'elderly', 'health']
并且我想使用:
con.query "SELECT col1 FROM data1 WHERE MATCH (col2) AGAINST (terms)"
这可能吗?
您可以在join
您的条款中只使用您的against
条款:
terms = ['genetics' , 'elderly', 'health']
con.query "SELECT col1 FROM data1 WHERE MATCH col2 AGAINST ('#{terms.join(' ')}')"
请注意,使用match/against
几乎肯定会比使用一系列like
子句更具执行性。有关更多信息,请参阅此 StackOverflow 答案:哪个 SQL 查询更好,MATCH AGAINST 或 LIKE?.
查看 MySQL 文档以获取有关全文搜索(包括可能的运算符)的更多信息:http: //dev.mysql.com/doc/refman/5.5/en/fulltext-search.html。
我强烈建议研究 ORM,例如Sequel,它可以很容易地以独立于 DBM 的方式生成正确的查询。
它允许我们方便地使用数组和哈希。下面是一个使用数组在 SQL 中生成“where”子句的示例:
my_posts = posts.where(:category => ['ruby', 'postgres', 'linux'])
# WHERE category IN ('ruby', 'postgres', 'linux')
该特定示例是“过滤记录”部分的一部分。
OP 在评论中说:
col2 是每一行都有一个段落的文本,而不仅仅是一个单词。
然后你想要一个LIKE
允许测试每个单词的或正则表达式子句。请参阅“数据集过滤”的“字符串搜索功能”部分,了解 Sequel 如何允许您在字符串中进行搜索。
代码将类似于:
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%'))