查询中的GROUP by - 我做错了什么?

时间:2015-11-24 16:46:49

标签: mysql group-by

SQLFiddle在这里:http://sqlfiddle.com/#!9/ade6a

我试图找出这个问题已经有2天了。在我正在处理的数据库中,他们没有使用表之间的关系。所以它使修复某些东西变得更加困难。我阅读了与" GROUP BY"相关的所有话题。但他们只能达到一定程度。

我的示例表。

消息(实际上我应该将其命名为Conversation以免混淆)

Id   No      s_id     r_id   adddate
----------------------------------------
1            7        6     2015-10-30 01:51:17     
2           15        6     2015-11-19 18:06:47
3           16        15    2015-11-22 19:28:01
4           7         15    2015-11-22 19:58:33
5           16        7     2015-11-22 20:36:36

Message_items

   id  m_id u_id  message               ip             addate     
     ----- -------------------------------------------------------------
    30  2   15  admin to user attempt2  127.0.0.1   2015-11-22 18:28:21
    31  2   6   user6 to admin attempt  127.0.0.1   2015-11-22 18:59:45 
    32  2   15  admin to user attempt3  127.0.0.1   2015-11-22 19:05:13

    33  3   16  user16 to admin attmp1  127.0.0.1   2015-11-22 19:28:01
    34  3   15  admin to user16 reply1  127.0.0.1   2015-11-22 19:30:01
    35  3   16  user16 to admin attempt2 127.0.0.1  2015-11-22 19:32:36

    36  4   7   user7 to admin attemp1  127.0.0.1   2015-11-22 19:59:52
    38  4   7   user7 to admin attempt2 127.0.0.1   2015-11-22 21:19:18
    39  4   7   user7 to admin attempt3 127.0.0.1   2015-11-22 21:20:19

   37   5   16  user16 to user7 attmpt1 127.0.0.1   2015-11-22 20:36:36
   40   5   7  user7  to user16 reply1 127.0.0.1   2015-11-22 20:45:12

m_id代表消息表中的id。 s_id发送者,r_id接收者,u_id用户。

起初我使用的是查询:我认为id现在已经是16了。

SELECT * FROM (

    SELECT m.id, m.s_id, m.r_id, i.id as i_id, i.u_id, i.m_id, i.adddate, i.message 
    FROM messages as m, 
    messages_items as i, 
    users as u 
    WHERE (m.s_id=16 or m.r_id=16) 
    and i.m_id=m.id 
    and u.id=i.u_id  
    ORDER BY i.id DESC

) as tmp GROUP BY m_id ORDER BY i_id DESC

输出: 我没有写属性"没有"因为它太长了。

 id | no | s_id |r_id|i_id|u_id| m_id|    adddate         |  message     

 5 |      | 16  | 7  | 37 | 16 | 5   | 2015-11-22 20:36:36| user16 to user7 attempt1
 3 |      | 16  | 15 |  33| 16 | 3   | 2015-11-22 19:28:01| user16 to admin attempt1

我需要什么:正如在Message_items中可以看到的那样,在第一个消息尝试之后还有2个消息尝试。我希望最后一个与小组合作。

期望输出:

 id | no | s_id |r_id|i_id|u_id| m_id|    adddate         |  message     

 5 |      | 7  | 16  | 40 | 7  | 5    | 2015-11-22 20:45:12| user7 to user16 reply1
 3 |      | 16  | 15 | 35 | 16 | 3   | 2015-11-22 19:32:36| user16 to admin attempt2

我尝试了什么?

1.我试过这个问题:

SELECT * FROM messages_items   
LEFT JOIN messages ON messages_items.m_id = messages.id   
WHERE messages_items.adddate=(SELECT MAX(adddate) FROM messages_items) 

此查询接近我想要的但它只提供此查询的一个结果。 输出:

id  m_id  u_id  id  s_id r_id        adddate           adddate   
39  4      7     4   7    15  2015-11-22 21:20:19 2015-11-22 19:58:33
       message
user7 to admin attempt3

这给出了我认为的最新消息。我用GROUP BY尝试了它,但它没有用。它没有显示其他组。

  1. 尝试
  2. 此查询也提供了结果,但我也需要从其他表中获取信息。例如,我需要从消息表中获取 s_id r_id

    SELECT m_id, adddate, message,   
        i.id as i_id, i.u_id 
    FROM messages_items as i
    WHERE adddate=(  
        SELECT MAX(adddate)   
        FROM messages_items   
        WHERE m_id = i.m_id 
    )GROUP BY m_id
    

    我期待着您的建议。先感谢您。

    编辑:简化问题;我需要首先使用最接近日期的GROUP BY消息项。 因此,当我打开消息部分时,最新消息项将出现在预览中。在我写的第一个查询中,它没有按此顺序对它们进行分组。

    第二次编辑:如果你想要实现我的目标,我还添加了(m.r_id = 16 OR m.s_id = 16)到@fancyPants解决方案的最后WHERE子句

1 个答案:

答案 0 :(得分:1)

根据我的理解,你几乎在最后一次查询中得到了它。这里不需要GROUP BY,引用子查询中的外部查询已经进行了分组。

然后你只需要再加入一次消息:

SELECT 
*
FROM message_items as i
JOIN messages m ON i.m_id = m.id
WHERE i.addate=(  
    SELECT MAX(adddate)   
    FROM message_items   
    WHERE m_id = i.m_id 
)

鉴于此样本数据:

CREATE TABLE messages
    (`Id` int, `s_id` int, `r_id` varchar(10), `adddate` datetime)
;

INSERT INTO messages
    (`Id`, `s_id`, `r_id`, `adddate`)
VALUES
    (1, 7, 6, '2015-10-30 01:51:17'),
    (2, 15, 6, '2015-11-19 18:06:47'),
    (3, 16, 15, '2015-11-22 19:28:01'),
    (4, 7, 15, '2015-11-22 19:58:33'),
    (5, 16, 7, '2015-11-22 20:36:36')
;


CREATE TABLE message_items
    (`id` int, `m_id` int, `u_id` int, `message` varchar(28), `ip` varchar(9), `addate` datetime)
;

INSERT INTO message_items
    (`id`, `m_id`, `u_id`, `message`, `ip`, `addate`)
VALUES
    (30, 2, 15, '''admin to user attempt2''', '127.0.0.1', '2015-11-22T18:28:21'),
    (31, 2, 6, '''user6 to admin attempt''', '127.0.0.1', '2015-11-22T18:59:45'),
    (32, 2, 15, '''admin to user attempt3''', '127.0.0.1', '2015-11-22T19:05:13'),
    (33, 3, 16, '''user16 to admin attmp1''', '127.0.0.1', '2015-11-22T19:28:01'),
    (34, 3, 15, '''admin to user16 reply1''', '127.0.0.1', '2015-11-22T19:30:01'),
    (35, 3, 16, '''user16 to admin attempt2''', '127.0.0.1', '2015-11-22T19:32:36'),
    (36, 4, 7, '''user7 to admin attemp1''', '127.0.0.1', '2015-11-22T19:59:52'),
    (38, 4, 7, '''user7 to admin attempt2''', '127.0.0.1', '2015-11-22T21:19:18'),
    (39, 4, 7, '''user7 to admin attempt3''', '127.0.0.1', '2015-11-22T21:20:19'),
    (37, 5, 16, '''user16 to user7 attmpt1''', '127.0.0.1', '2015-11-22T20:36:36'),
    (40, 5, 7, '''user7  to user16 reply1''', '127.0.0.1', '2015-11-22T20:45:12')
;

上述查询产生了这个结果:

| id | m_id | u_id |                   message |        ip |                     addate | Id | s_id | r_id |                    adddate |
|----|------|------|---------------------------|-----------|----------------------------|----|------|------|----------------------------|
| 33 |    3 |   16 |  'user16 to admin attmp1' | 127.0.0.1 | November, 22 2015 19:28:01 |  3 |   16 |   15 | November, 22 2015 19:28:01 |
| 37 |    5 |   16 | 'user16 to user7 attmpt1' | 127.0.0.1 | November, 22 2015 20:36:36 |  5 |   16 |    7 | November, 22 2015 20:36:36 |