我目前正在使用 actix_web 和diesel in Rust 开发一个api。现在回答我的问题;我正在尝试发出这样的 sql 请求:
SELECT * FROM customers c
JOIN users u ON u.name = c.customer_no
JOIN address a ON c.fk_address = a.id
WHERE a.name='10715';
有一个使用diesel进行多重连接的实际文档,但仅适用于隐式连接,可以在此处找到:
https://docs.diesel.rs/diesel/query_dsl/trait.QueryDsl.html#method.inner_join
显式和隐式有什么区别?
通过宏隐式定义关系:
users.inner_join(posts)
显式定义查询语句中的关系:
users.inner_join(posts::table.on(posts::id.eq(user::id)))
有谁知道如何使用多个显式联接发出请求:
这有效:
users.inner_join(posts.inner_join(comments))
这不是:
users.inner_join(
posts::table.on(posts::id.eq(user::id))
.inner_join(comments::table.on(comments::id.eq(post::id)))
)
最佳答案
您的初始 SQL 查询将使用 Diesel 编写,如下所示 ( complete example ):
customers::table
.inner_join(users::table.on(users::name.eq(customers::customer_no)))
.inner_join(address::table.on(address::id.eq(customers::fk_address)))
.filter(users::name.eq("10715"));
您可能会对此保持警惕,因为 documentation on .inner_join()
警告链式连接与嵌套连接不同:
Diesel expects multi-table joins to be semantically grouped based on the relationships. For example,
users.inner_join(posts.inner_join(comments))
is not the same asusers.inner_join(posts).inner_join(comments)
. The first would deserialize into(User, (Post, Comment))
and generate the following SQL:SELECT * FROM users INNER JOIN posts ON posts.user_id = users.id INNER JOIN comments ON comments.post_id = posts.id
While the second query would deserialize into
(User, Post, Comment)
and generate the following SQL:SELECT * FROM users INNER JOIN posts ON posts.user_id = users.id INNER JOIN comments ON comments.user_id = users.id
但是,所提出的问题只是一个问题,因为 joinable!
生成了隐式 ON 子句。宏。如果用户是链接的,则查询将默认将 comments
连接到 users
,而不是像人们可能的那样将 comments
连接到 posts
预计。当您显式提供 ON 子句时,这不是问题;由于您自己编写 JOIN 标准,因此您想要的内容没有任何歧义。
您始终可以使用debug_query
如果您有任何疑问,请打印生成的 SQL。
关于rust - 如何使用 Diesel 编写多个显式的 inner_join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73559824/