【发布时间】:2017-03-02 23:14:18
【问题描述】:
我的 mysql 表看起来像:
user_messages
标识 |用户 ID |电话号码 |留言 |方向 | created_at
用户
标识 |名字
我想将 user_messages 'group by' 两次,然后 UNION 结果。我为什么要这样做?因为 user_id 有时有一个有效的用户 id(除了'-1')然后我按它分组,如果它有 -1,然后按 phone_number 分组。
如果 user_id 设置为有效用户,我还想将结果与 users 表左连接以获取用户名
我几乎完成了查询,但问题是:
- 我希望结果具有来自 group by 的记录是最新的,这意味着最大的 created_at 值
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
这让我得到的是未按 created_at DESC 排序的结果
更新:
该查询实际上在我的本地机器上有效,但在生产服务器上无效。在我的本地机器上我有 5.5.42 - Source distribution 和在服务器上 Ver 14.14 Distrib 5.7.17, for Linux (x86_64) using EditLine wrapper ... 有什么问题?
在本地机器上,它正确地返回了 max created_at,但在服务器上,它返回了为按记录分组而创建的 FIRST
【问题讨论】:
-
您能否提供样本数据和样本数据的预期结果?我觉得这个查询可以简化很多。查看数据可以更好地理解问题。
-
SELECT *, COUNT(*) FROM .... GROUP BY [non-row-identity field]很少是个好主意。 -
@JorgeCampos 它确实有效,但在远程服务器上给了我不同的结果。我已经更新了我的问题!