微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

mysql – arel union和来自消息的最新会话

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

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] 举报,一经查实,本站将立刻删除。

相关推荐