我有一个问题。我有一个查询,返回来自一个表(比如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}]。我需要一些可行的方法将ids传递给第二个查询。我尝试过ids.to_a,但由于括号[ ]而出错。我还尝试了连接,假设MySQL结果为:
array = ids.to_a # [1,2,3]
id_new = "("+#{array.join(',')}+")"
id_new变成了字符串"(1,2,3)",因此IN无法工作。
有没有人能够建议一下如何在原始的MySQL查询中传递id数组? 我已经尝试寻找答案很久了,但是找不到一个合适的答案。
编辑: 我只能对query1使用Active Record,如果是这种情况,并且ids是一个Active Record对象,有人能否建议如何将其传递给query2中的IN子句,该子句应该是一个原始的SQL查询?
编辑2: 我不能使用Active Record(对于query2)或join,因为它会使查询变得沉重并需要长时间(>10s)才能获取结果(索引存在)。 因此,我正在使用原始查询进行优化。
pluck
方法获取ID数组而不是整个模型:ModelForTable1.where(:code => 'ABC123').pluck(:id)
将会得到类似[23,92,1,2]
的结果。 - Sven Koschnicke