当前位置: 首页 > 知识库问答 >
问题:

如何连接/合并同一表中的多个结果?

堵德曜
2023-03-14

我看到的mysql表如下所示:

用户信息

id |用户id |电话号码|信息|方向|创建于

用户

id |名称

我想'组由'user_messages两次和UNION的结果。我为什么要这么做?因为user_id有时有一个有效的用户ID(不是'-1'),所以我按它分组,如果它有-1,则按phone_number分组。

我也想左加入结果与用户表以获得用户名的情况下user_id设置为一个有效的用户

我几乎完成了查询,但问题是:
-我希望结果中group by生成的记录是最新的记录,这意味着创建的值最大

select * from (
(
    select *, count(*) as `total` from
      (select `user_id`, `message`, `created_at`, `phone_number`,`direction` from `users_messages` where `user_id` != -1  order by `created_at` desc)
    as `t1` group by `user_id`
)
union
(
    select *, count(*) as `total` from
        (select `user_id`, `message`, `created_at`, `phone_number`,`direction`  from `users_messages` where `user_id` = -1 order by `created_at` desc)
    as `t2` group by `phone_number`
)
) as `t3`
left join (select `id`,`name` from `users`) as `t4` on `t3`.`user_id` = `t4`.`id` order by `created_at` desc

这让我想到的是结果不是按DESC中的created_排序的

更新:查询实际上在我的本地机器上工作,但在生产服务器上不工作。在我的本地机器中,我有5.5。42-源发行版和服务器14.14发行版5.7中的版本。17,对于使用编辑行包装的Linux(x86_64)。。。有什么不对劲吗?

在本地机器中,它正确地返回最大created_at但在服务器中,它返回为记录分组创建的第一个

共有2个答案

公西英叡
2023-03-14

由于您按user_id和phone_number分组,因此无法保留消息或方向。为每个子查询中的created_at添加一个max函数。我认为这行得通。

select * from (
(
    select user_id
          ,'' as phone_number
          ,max('created_at') as 'created_at'
          ,count(*) as `total` from
      (select `user_id`
             ,`created_at`
       from `users_messages` 
       where `user_id` != -1)
    as `t1` group by `user_id`
)
union
(
    select '' as user_id
          ,phone_number
          ,max('created at') as 'created_at'
          ,count(*) as `total` from
        (select `created_at`
               ,`phone_number'
         from `users_messages` 
         where `user_id` = -1)
    as `t2` group by `phone_number`
)
) as `t3`
left join (select `id`,`name` from `users`) as `t4` 
on `t3`.`user_id` = `t4`.`id` 
order by `created_at` desc
李辉
2023-03-14

这样的东西应该工作:

SELECT s.`user_id`, um.`phone_number`, s.msgCount
   , um.`message`, um.`created_at`, um.`direction`
   , u.`name` AS userName
FROM (
    SELECT `user_id`, IF(`user_id` = -1, `phone_number`, '') AS altID, MAX(`created_at`) AS lastCreatedAt, COUNT(*) AS msgCount
    FROM `users_messages` 
    GROUP BY user_id, altID
) AS s
INNER JOIN `users_messages` AS um 
    ON s.user_id = um.user_id 
    AND s.altID = IF(um.`user_id` = -1, um.`phone_number`, '')
    AND s.lastCreatedAt = um.created_at
LEFT JOIN `users` AS u
    ON s.user_id = u.user_id
ORDER BY um.created_at DESC
;
  • s子查询获取每个用户和无用户电话号码的摘要信息;计算的摘要信息包括在处创建的最新值,以便在以下情况下使用
  • 加入um获取其最后一条消息的行数据(通过在加入条件中包含s中的lastCreatedAt值)
  • 最后一次加入用户用于获取用户。已知用户的名称(并假设没有-1用户,或者这样的用户将有一个合适的'unknown'名称。)
 类似资料:
  • 问题内容: 我想将列表的内容添加在一起,创建以下列表: 是否有专门以这种方式合并列表的功能? 问题答案: 这有效: 上面解释了上面使用的所有内置函数。 另一个解决方案是使用列表推导。 根据您的口味,您可以执行以下操作: 或这个:

  • 问题内容: 如何选择多个表并从同一列联接多个行? 它不会返回,并且。我确定此SQL代码段的语法错误。 更新: 显示。移除后 它返回: 但我需要退货: 问题答案: 您可以多次连接到同一张表,而只需提供不同的别名

  • 问题内容: 我有两个桌子和。表具有字段和其他几个字段。表具有3个字段: 是固定的值枚举。例如,它可以是,或。 我需要进行查询,其结果将是4列: ,对,对,对 如果不存在用于相应值在表然后NULL值应在相应的列中显示。 例: 结果应该是: 我尝试了3次左联接表,但无法弄清楚如何排列输出 问题答案: 您需要使用多个: 这是一个示例:SQL Fiddle。

  • > 帐户表:accountId(PK)电子邮件密码 account_profile表:accountId(PK)(fk到account)昵称 团体表:articleId(PK)accountId(fk to account)标题内容 现在我想要下面的JPQL是查询DSL代码 我有实体元模型-QAccount、QAccountProfile、QCommunity 此外,我必须通过分页获得结果,因此应

  • 我有索引,其中每个文档都有这样的结构: 我需要计算每个演员对应的电影数量(演员可以在actor_1_name、actor_2_name或actor_3_name字段中) 这3个字段的映射是: 有没有一种方法,我可以聚合的结果,可以结合所有3个演员领域的条款,并给出一个单一的聚合。 目前,我正在为每个actor字段创建单独的聚合,并通过我的JAVA代码将这些不同的聚合合并成一个。 通过创建不同的聚合

  • 问题内容: 我有一个带有用于发布的表的数据库,每个表可以有多个作者,这些作者存储在不同的表中。我想查询数据库,以便在第一列中提供出版物标题列表,在第二列中提供该出版物的合并作者。 当然,这使我多次获得了许多作者的出版物标题。 按ID分组后,每个标题给我一个作者: 我正在寻找的结果是这样的: 我认为应该在使用GROUP_CONCAT中找到答案,但是我唯一能得到的结果是所有作者的一个结果行: 在联接之