2017-03-02 50 views
0

我已经MySQL表,看起来像:如何加入/联合来自同一个表的多个结果?

user_messages

ID | user_id | phone_number |消息|方向| created_at

用户

ID |名称

我想通过'group_'user_messages两次和UNION结果。为什么我想这样做?因为user_id有时有一个有效的用户标识(除'-1'之外的任何东西),那么我按它分组,如果它有-1,则按phone_number分组。

我也想留给用户表连接的结果得到的情况下,USER_ID被设置为一个有效的用户

我几乎与查询做了用户名,但问题是:
- 我想要的结果,以具有通过从组结果是最新的一个,这意味着,最大的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 ...什么可能是错误的?

在本地机器上它正确返回我最大created_at但在服务器它返回由记录

+0

你可以提供一个样本数据和来自y的期望结果我们的样本数据?我觉得这个查询可以简化很多。查看数据可以更好地理解问题。 –

+0

'SELECT *,COUNT(*)FROM .... GROUP BY [非行标识字段]'很少是个好主意。 – Uueerdo

+0

@JorgeCampos它实际上工作,但在远程服务器给了我不同的结果..我已经更新了我的问题! – HorusCoding

回答

1

像这样的东西应该工作:

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子查询获取每个用户和userless电话号码的摘要信息;计算出的摘要信息包括在以下使用最新的created_at价值....
  • 的加盟um得到了他们的最后消息的行数据(由包括来自s在连接标准的lastCreatedAt值)
  • 最后加入到users被用于获取user.name为已知用户(并假设不会有-1用户,或者说这样的用户将有适当的'unknown'名)。
+0

它很有意义,但为什么我得到:'在子句'中的未知列'u.user_id' – HorusCoding

+0

工程就像一个魅力!!!!!!!!!我刚刚编辑u.user_id成为u.id 你是最棒的! – HorusCoding

1

既然你通过USER_ID和PHONE_NUMBER分组分组创建的第一个,你不能保持消息或方向。在每个子查询中为created_at添加一个最大函数。我认为这会奏效。

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 
+0

我的查询实际上工作,但在远程服务器给了我不同的结果..我已经更新了我的问题! – HorusCoding

相关问题