【问题标题】:How do I create a MySQL query using an array?如何使用数组创建 MySQL 查询?
【发布时间】:2013-06-29 01:50:06
【问题描述】:

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

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

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

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

这可能吗?

【问题讨论】:

  • 需要更多信息。举几个例子。
  • 所以,例如我有 terms = ['genetics' , 'elderly', 'health'] 我想使用 con.query "SELECT col1 FROM data1 WHERE MATCH (col2) AGAINST (terms )" 这可能吗?
  • 你有什么,我看不到。
  • 对不起,不小心按得太早了!
  • 我不明白你的问题。是mysql相关还是ruby数组相关?

标签: mysql ruby arrays


【解决方案1】:

您可以在against 子句中使用join 条款:

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

【讨论】:

  • 感谢您的建议!我确实尝试过,但它什么也没返回。如果有帮助,col2 是每一行都有一个段落的文本,而不仅仅是一个单词。我不确定这是否就是为什么我能够得到一些结果如此麻烦的原因,但只能从这个:terms = ['genetics'] _terms = terms.map{|x| "'" + x + "'"}.join(',') rs= con.query "SELECT col1 FROM data1 WHERE MATCH col2 against (#{_terms})" 如您所见,我只能在以下情况下得到结果数组有一个元素...
  • 如果您需要更改答案,则无需使用<del> 标签。 Stack Overflow 会保留您的编辑历史记录,以便我们在需要时查看更改。
  • 正是我需要的。非常感谢!
【解决方案2】:

我强烈建议您研究 ORM,例如 Sequel,这样可以很容易地以独立于 DBM 的方式生成正确的查询。

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

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

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

在评论中,OP 说:

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

然后您需要一个允许测试每个单词的LIKE 或正则表达式子句。请参阅“数据集过滤”的“String search functions”部分,了解 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%'))

【讨论】:

  • 查看@howluocanyougo 对我的回答的评论,这表明他/她想要进行完整的索引搜索,而不是where/in 查询。我最初的答案(您已删除)与您上面所说的几乎相同(使用 AR 而不是 Sequel)。
  • 您的原始答案仍然存在。您可以通过单击“已编辑”链接回滚到它。那时,我建议将原始答案与您更新的答案合并以显示两者,并引用 OP 的评论以阐明您添加新内容的原因。
  • 感谢您的建议! kardeiz 实际上是正确的,但我肯定会研究续集!
猜你喜欢
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 2011-03-25
  • 2013-09-02
  • 2016-05-20
  • 1970-01-01
相关资源
最近更新 更多