我需要一个消息列表,其中每个消息都是当前用户和其他用户之间“对话”中的最新消息.
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 bug吗?
其次,非常感谢任何有关完成查询的帮助.
更新:
使用Arel :: Nodes :: Union.new有效
解决方法:
我认为这可能是一个MysqL错误,这是一个MysqL错误文本.在here中讨论了类似的东西,但不完全是这个问题.
尝试迁移到另一个sql server,再次检查,或者如果union all工作,那么使用this:
conv = convs1.union(convs2, :all)
基于文档.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。