gpt4 book ai didi

mysql - 如何用原始MySQL重写 "includes"命令?

转载 作者:行者123 更新时间:2023-11-29 23:19:08 24 4
gpt4 key购买 nike

如果我运行命令

@users = User.includes(:addresses)

然后生成这两个查询:

#  SELECT "users".* FROM "users" 
# SELECT "addresses".* FROM "addresses" WHERE "addresses"."user_id" IN (1, 2)

有什么方法可以用纯 MySQL 进行这种构造(includes)吗?就像是:@users = User.find_by_sql("...")

最佳答案

不,它们是两个具有不同结果集的查询,因此您无法以任何有用的方式合并它们。

ActiveRecord 本质上是这样做的:

  1. 执行第一个查询以获取所有User
  2. 从第一个结果集中提取User id以构建第二个查询。
  3. 执行第二个查询以获取与 1 中的用户关联的所有地址
  4. user_idAddress 进行切片,并将这些片段存储在相应的 User 中。

因此,includes 所做的只是一次性扩展关联,而不是逐个用户扩展关联(即每个用户一个查询,又名 n+1) .

欢迎您自行模拟 AR 正在执行的操作,但您仍然需要执行两个查询。

<小时/>

如果您使用的是支持数组的数据库(例如 PostgreSQL),那么您可以使用聚合在一个查询中完成此操作:

select u.*, array_agg(a.*)
from users u
left join addresses a on u.id = a.user_id
group by u.id, ...

这种事情会让 ActiveRecord 感到困惑,并让你手动解压结果。我怀疑上面的方法是否会更快。

关于mysql - 如何用原始MySQL重写 "includes"命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27489963/

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