1

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

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

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

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

这可能吗?

4

2 回答 2

0

您可以在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

于 2013-07-01T22:07:33.097 回答
0

我强烈建议研究 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%'))
于 2013-07-02T14:50:45.343 回答