所以,我有一个问题.我有一个查询,它从一个表(例如table1)返回ID,我必须将这些ID传递给另一个使用table2的查询. (由于某些原因,不能选择内部选择或联接).
查询:
client = MysqL2::Client.new(:host => "localhost", :username => "", :password => "", :database =>"test")
query1 = %Q{select id from table1 where code='ABC123'}
ids = client.query(query1)
query2 = %Q{select * from table2 where `table2`.`table1_id` IN (#{ids}) and status="rejected"}
table2_data = client.query(query2)
ids是MysqL2 :: Result类型
另外,当我执行ids.to_a时,结果数组具有类似以下数据:[{“ id” => 1},{“ id” => 2}]
我需要一些可行的方法来将ID传递给第二个查询.我尝试了ids.to_a,但是由于括号[]导致错误.我也尝试过串联,说MysqL结果是:
array = ids.to_a # [1,2,3]
id_new = "("+#{array.join(',')}+")"
id_new变成字符串的“(1,2,3)”,因此IN不起作用.
任何人都可以建议一些如何在原始MySQL查询中传递ID数组的方法吗?
我已经不知所措了,但找不到合适的答案.
编辑:我只能将Active Record用于query1,如果是这种情况,并且id是Active Record对象,那么谁能建议如何在应该是原始SQL查询的IN子句中将其传递给query2?
Edit2:我不能使用Active Record(用于query2)或联接,因为它使查询变得繁重,并且花费很长时间(> 10s)来获取结果(存在索引).因此,我正在使用原始查询对其进行优化.
解决方法:
您确定它不起作用是因为它是一个字符串.我认为由于括号重复而无法使用.请尝试以下方法:
array = ids.flat_map(&:values).join(',')
query2 = %Q{select * from table2 where `table2`.`table1_id` IN (#{array}) and status="rejected"}
我建议使用ORM (object-relational mapping),例如ActiveRecord
或Sequel
gems-尤其是因为通过字符串填充手动构建数据库查询容易出错,并且会导致诸如sql注入之类的漏洞.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。