我看到的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但在服务器中,它返回为记录分组创建的第一个
由于您按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
这样的东西应该工作:
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中找到答案,但是我唯一能得到的结果是所有作者的一个结果行: 在联接之