gpt4 book ai didi

mysql - arel union和消息中的最新对话

转载 作者:可可西里 更新时间:2023-11-01 07:35:39 25 4
gpt4 key购买 nike

我需要一个消息列表,其中每条消息都是当前用户与其他用户之间“对话”中的最新消息。

描述了相同的查询 in this question

我目前的代码是:

t1 = Arel::Table.new(:messages, :as => 't1')
t2 = Arel::Table.new(:messages, :as => 't2')

convs1 = t1.
project(
t1[:receiver_user_id].as('other_user_id'),
t1[:receiver_user_id].as('receiver_user_id'),
t1[:sender_user_id].as('sender_user_id'),
t1[:created_at].as('created_at')
).
where(t1[:sender_user_id].eq(user.id))

convs2 = t2.project(
t2[:sender_user_id].as('other_user_id'),
t2[:receiver_user_id].as('receiver_user_id'),
t2[:sender_user_id].as('sender_user_id'),
t2[:created_at].as('created_at')
).
where(t2[:receiver_user_id].eq(user.id))

conv = convs1.union(convs2)

首先,我得到一个错误:

ActiveRecord::StatementInvalid: Mysql2::Error: You have an error in your SQL syntax; check \
the manual that corresponds to your MySQL server version for the right syntax to use near \
'UNION SELECT `t2`...

如果我在下面生成的 sql 中手动将“UNION”替换为“UNION ALL”,这将起作用。上面代码中的 conv.to_sql 产生:

SELECT `t1`.`receiver_user_id` AS other_user_id, 
`t1`.`receiver_user_id` AS receiver_user_id, `
t1`.`sender_user_id` AS sender_user_id,
`t1`.`created_at` AS created_at
FROM `messages` `t1`
WHERE `t1`.`sender_user_id` = 50
UNION
SELECT `t2`.`sender_user_id` AS other_user_id,
`t2`.`receiver_user_id` AS receiver_user_id,
`t2`.`sender_user_id` AS sender_user_id,
`t2`.`created_at` AS created_at
FROM `messages` `t2`
WHERE `t2`.`receiver_user_id` = 50

知道为什么会出现 MySQL UNION 错误。这是一个arel错误吗?其次,如果您能帮助完成查询,我们将不胜感激。

更新:使用 Arel::Nodes::Union.new 有效

最佳答案

我认为这更可能是mysql故障,这是一个mySQL错误文本。 here 中讨论了类似的内容,但不完全是这个问题。

尝试迁移到另一个 sql server,然后再次检查,或者如果 union all 有效,则使用 this :

conv = convs1.union(convs2, :all)

基于文档。

关于mysql - arel union和消息中的最新对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11924311/

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