gpt4 book ai didi

mysql - 在 Ruby on Rails 中的原始 MySQL 查询中传递数组

转载 作者:可可西里 更新时间:2023-11-01 08:11:05 27 4
gpt4 key购买 nike

所以,我有一个问题。我有一个从一个表(比如 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 查询中传递 ids 数组吗?我绞尽脑汁寻找答案,但找不到合适的答案。

编辑:我只能将 Active Record 用于 query1,如果是这种情况并且 ids 是一个 Active Record 对象,谁能建议如何将它传递给 IN 子句中的 query2,这是应该的成为原始 SQL 查询?

Edit2:我无法使用 Active Record(用于查询 2)或加入,因为它会使查询变得繁重并且需要很长时间(>10 秒)来获取结果(存在索引)。因此,我使用原始查询对其进行优化。

最佳答案

当我运行类似的查询来尝试模拟您的问题时,我发现我得到了一个包含 ids 的数组,例如 [["1"], ["2"], ["3"]].

如果这也是你得到的,那么你应该在调用 join 之前调用 ids.flatten:

query2 = %Q{select * from table2 where `table2`.`table1_id` IN (#{ids.flatten.join(',')}) and status="rejected"}

array.flatten 删除多余的大括号,因此:

[[1], [2], [3]].flatten
# => [1,2,3]

[[1], [2], [3]].flatten.join(',')
# => "1,2,3"

编辑

因为你报告你正在接收一个 Mysql2::Result 对象,所以这样做:ids.to_a.map(&:values).flatten.join(',')

to_a 首先将 Mysql2::Result 转换为哈希数组,如下所示:

[{"id"=>"1"}, {"id"=>"2"}]

然后使用 map(&:values) 我们将其转换为如下所示的数组:

[["1"], ["2"]]

这个数组与上面的类似(编辑之前),因此运行 flatten.join(',') 会将其转换为您要查找的字符串。

请注意,您可以使用通用快捷方式 flat_map(&:values) 而不是执行 map(&:values).flatten,这会产生相同的结果。

关于mysql - 在 Ruby on Rails 中的原始 MySQL 查询中传递数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33665623/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com