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尝试了它,但它没有用。它没有显示其他组。
此查询也提供了结果,但我也需要从其他表中获取信息。例如,我需要从消息表中获取否, 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子句
答案 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 |