一个查询问题,大家帮忙看看

youfeng445 2013-07-04 01:51:37

2个表
1.用户
字段: id, name
用户id,用户名
2.聊天表
字段: id, fromUserId, toUserId, content, date
id, 发送方id,接收方id, 发送内容, 发送日期

现在要查出 当前用户发过信息,过着发信息给过当前用户的最后5个用户信息,以及最后发表的那条信息的内容,发送时间

写来写去没出来,求高手帮忙
...全文
285 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
youfeng445 2013-07-05
  • 打赏
  • 举报
回复
引用 13 楼 ACMAIN_CHM 的回复:
mysql> select * from user_info;
+----+----------+
| id | username |
+----+----------+
|  1 | 张三     |
|  2 | 李四     |
|  3 | 王五     |
|  4 | 赵六     |
|  5 | 丁七     |
+----+----------+
5 rows in set (0.00 sec)

mysql> select * from chat_message;
+----+------------+----------+-------------+---------------------+
| id | fromUserId | toUserId | content     | createDate          |
+----+------------+----------+-------------+---------------------+
|  1 |          1 |        2 | 张三到李四1 | 2013-07-04 15:32:40 |
|  2 |          1 |        3 | 张三到王五1 | 2013-07-04 15:33:04 |
|  3 |          1 |        4 | 张三到赵六1 | 2013-07-04 15:34:39 |
|  4 |          2 |        1 | 消息....112 | 2013-07-04 15:38:56 |
|  5 |          2 |        3 | 消息....113 | 2013-07-04 15:38:56 |
|  6 |          2 |        4 | 消息....114 | 2013-07-04 15:38:56 |
|  7 |          2 |        5 | 消息....115 | 2013-07-04 15:38:57 |
|  8 |          3 |        1 | 消息....116 | 2013-07-04 15:38:57 |
|  9 |          3 |        2 | 消息....117 | 2013-07-04 15:38:57 |
| 10 |          3 |        4 | 消息....118 | 2013-07-04 15:38:57 |
| 11 |          3 |        5 | 消息....119 | 2013-07-04 15:38:57 |
| 12 |          4 |        1 | 消息....120 | 2013-07-04 15:38:57 |
| 13 |          4 |        2 | 消息....121 | 2013-07-04 15:38:57 |
| 14 |          4 |        3 | 消息....122 | 2013-07-04 15:38:57 |
| 15 |          4 |        5 | 消息....123 | 2013-07-04 15:38:57 |
| 16 |          5 |        1 | 消息....124 | 2013-07-04 15:38:57 |
| 17 |          5 |        2 | 消息....125 | 2013-07-04 15:38:57 |
| 18 |          5 |        4 | 消息....126 | 2013-07-04 15:38:57 |
| 19 |          5 |        3 | 消息....127 | 2013-07-04 15:38:57 |
| 20 |          1 |        2 | 消息....1   | 2013-07-04 15:40:36 |
| 21 |          1 |        3 | 消息....2   | 2013-07-04 15:40:36 |
| 22 |          1 |        4 | 消息....3   | 2013-07-04 15:40:36 |
| 23 |          1 |        5 | 消息....4   | 2013-07-04 15:40:36 |
| 24 |          2 |        1 | 消息....5   | 2013-07-04 15:40:36 |
| 25 |          2 |        3 | 消息....6   | 2013-07-04 15:40:36 |
| 26 |          2 |        4 | 消息....7   | 2013-07-04 15:40:36 |
| 27 |          2 |        5 | 消息....8   | 2013-07-04 15:40:36 |
| 28 |          3 |        1 | 消息....9   | 2013-07-04 15:40:36 |
| 29 |          3 |        2 | 消息....10  | 2013-07-04 15:40:36 |
| 30 |          3 |        4 | 消息....11  | 2013-07-04 15:40:37 |
| 31 |          3 |        5 | 消息....12  | 2013-07-04 15:40:37 |
| 32 |          4 |        1 | 消息....13  | 2013-07-04 15:40:37 |
| 33 |          4 |        2 | 消息....14  | 2013-07-04 15:40:37 |
| 34 |          4 |        3 | 消息....15  | 2013-07-04 15:40:37 |
| 35 |          4 |        5 | 消息....16  | 2013-07-04 15:40:37 |
| 36 |          5 |        1 | 消息....17  | 2013-07-04 15:40:37 |
| 37 |          5 |        2 | 消息....18  | 2013-07-04 15:40:37 |
| 38 |          5 |        4 | 消息....19  | 2013-07-04 15:40:37 |
| 39 |          5 |        3 | 消息....20  | 2013-07-04 15:40:37 |
+----+------------+----------+-------------+---------------------+
39 rows in set (0.00 sec)

mysql> select username,content,createDate
    -> from (
    -> select m.id,m.toUserId as uid,m.content,m.createDate
    -> from chat_message m,user_info u
    -> where m.fromUserId=u.id
    -> and u.username='王五'
    -> union all
    -> select m.id,m.fromUserId,m.content ,m.createDate
    -> from chat_message m, user_info u
    -> where m.toUserId=u.id
    -> and u.username='王五'
    -> order by  createDate desc
    -> ) t,   user_info v
    -> where t.uid=v.id
    -> group by uid
    -> order by createDate desc
    -> limit 2;
+----------+------------+---------------------+
| username | content    | createDate          |
+----------+------------+---------------------+
| 赵六     | 消息....15 | 2013-07-04 15:40:37 |
| 丁七     | 消息....20 | 2013-07-04 15:40:37 |
+----------+------------+---------------------+
2 rows in set (0.02 sec)

mysql>
多谢版主
ACMAIN_CHM 2013-07-05
  • 打赏
  • 举报
回复
mysql> select * from user_info;
+----+----------+
| id | username |
+----+----------+
|  1 | 张三     |
|  2 | 李四     |
|  3 | 王五     |
|  4 | 赵六     |
|  5 | 丁七     |
+----+----------+
5 rows in set (0.00 sec)

mysql> select * from chat_message;
+----+------------+----------+-------------+---------------------+
| id | fromUserId | toUserId | content     | createDate          |
+----+------------+----------+-------------+---------------------+
|  1 |          1 |        2 | 张三到李四1 | 2013-07-04 15:32:40 |
|  2 |          1 |        3 | 张三到王五1 | 2013-07-04 15:33:04 |
|  3 |          1 |        4 | 张三到赵六1 | 2013-07-04 15:34:39 |
|  4 |          2 |        1 | 消息....112 | 2013-07-04 15:38:56 |
|  5 |          2 |        3 | 消息....113 | 2013-07-04 15:38:56 |
|  6 |          2 |        4 | 消息....114 | 2013-07-04 15:38:56 |
|  7 |          2 |        5 | 消息....115 | 2013-07-04 15:38:57 |
|  8 |          3 |        1 | 消息....116 | 2013-07-04 15:38:57 |
|  9 |          3 |        2 | 消息....117 | 2013-07-04 15:38:57 |
| 10 |          3 |        4 | 消息....118 | 2013-07-04 15:38:57 |
| 11 |          3 |        5 | 消息....119 | 2013-07-04 15:38:57 |
| 12 |          4 |        1 | 消息....120 | 2013-07-04 15:38:57 |
| 13 |          4 |        2 | 消息....121 | 2013-07-04 15:38:57 |
| 14 |          4 |        3 | 消息....122 | 2013-07-04 15:38:57 |
| 15 |          4 |        5 | 消息....123 | 2013-07-04 15:38:57 |
| 16 |          5 |        1 | 消息....124 | 2013-07-04 15:38:57 |
| 17 |          5 |        2 | 消息....125 | 2013-07-04 15:38:57 |
| 18 |          5 |        4 | 消息....126 | 2013-07-04 15:38:57 |
| 19 |          5 |        3 | 消息....127 | 2013-07-04 15:38:57 |
| 20 |          1 |        2 | 消息....1   | 2013-07-04 15:40:36 |
| 21 |          1 |        3 | 消息....2   | 2013-07-04 15:40:36 |
| 22 |          1 |        4 | 消息....3   | 2013-07-04 15:40:36 |
| 23 |          1 |        5 | 消息....4   | 2013-07-04 15:40:36 |
| 24 |          2 |        1 | 消息....5   | 2013-07-04 15:40:36 |
| 25 |          2 |        3 | 消息....6   | 2013-07-04 15:40:36 |
| 26 |          2 |        4 | 消息....7   | 2013-07-04 15:40:36 |
| 27 |          2 |        5 | 消息....8   | 2013-07-04 15:40:36 |
| 28 |          3 |        1 | 消息....9   | 2013-07-04 15:40:36 |
| 29 |          3 |        2 | 消息....10  | 2013-07-04 15:40:36 |
| 30 |          3 |        4 | 消息....11  | 2013-07-04 15:40:37 |
| 31 |          3 |        5 | 消息....12  | 2013-07-04 15:40:37 |
| 32 |          4 |        1 | 消息....13  | 2013-07-04 15:40:37 |
| 33 |          4 |        2 | 消息....14  | 2013-07-04 15:40:37 |
| 34 |          4 |        3 | 消息....15  | 2013-07-04 15:40:37 |
| 35 |          4 |        5 | 消息....16  | 2013-07-04 15:40:37 |
| 36 |          5 |        1 | 消息....17  | 2013-07-04 15:40:37 |
| 37 |          5 |        2 | 消息....18  | 2013-07-04 15:40:37 |
| 38 |          5 |        4 | 消息....19  | 2013-07-04 15:40:37 |
| 39 |          5 |        3 | 消息....20  | 2013-07-04 15:40:37 |
+----+------------+----------+-------------+---------------------+
39 rows in set (0.00 sec)

mysql> select username,content,createDate
    -> from (
    -> select m.id,m.toUserId as uid,m.content,m.createDate
    -> from chat_message m,user_info u
    -> where m.fromUserId=u.id
    -> and u.username='王五'
    -> union all
    -> select m.id,m.fromUserId,m.content ,m.createDate
    -> from chat_message m, user_info u
    -> where m.toUserId=u.id
    -> and u.username='王五'
    -> order by  createDate desc
    -> ) t,   user_info v
    -> where t.uid=v.id
    -> group by uid
    -> order by createDate desc
    -> limit 2;
+----------+------------+---------------------+
| username | content    | createDate          |
+----------+------------+---------------------+
| 赵六     | 消息....15 | 2013-07-04 15:40:37 |
| 丁七     | 消息....20 | 2013-07-04 15:40:37 |
+----------+------------+---------------------+
2 rows in set (0.02 sec)

mysql>
youfeng445 2013-07-04
  • 打赏
  • 举报
回复
引用 11 楼 hhybtcz 的回复:
也许不用这样实现,打开企鹅的会话面板,应该是先看到好友的列表,然后最近聊天记录才加载进来。 sorry,没有想到更好的写法。
如果没有更好的办法,只能分2次查询了
Backache 2013-07-04
  • 打赏
  • 举报
回复
也许不用这样实现,打开企鹅的会话面板,应该是先看到好友的列表,然后最近聊天记录才加载进来。 sorry,没有想到更好的写法。
youfeng445 2013-07-04
  • 打赏
  • 举报
回复
引用 9 楼 hhybtcz 的回复:
这个非要一次都查出来吗?? select *, (select content from chat_message where fromUserId = t2.fromUserId and toUserId = (select id from user_info where username='王五') order by id desc limit 1), (select createDate from chat_message where fromUserId = t2.fromUserId and toUserId = (select id from user_info where username='王五') order by id desc limit 1) from user_info t1 right join (select distinct fromUserId from chat_message where toUserid = (select id from user_info where username='王五') order by id desc limit 2) t2 on t1.id = t2.fromUserId
可能没有表达清楚: 我们现在项目中有个聊天功能,我现在这个SQL是要求写出最近跟用户聊天的历史记录, 就和QQ上的历史聊天记录列表一样,包含,用户名称,最后聊天内容和时间
Backache 2013-07-04
  • 打赏
  • 举报
回复
这个非要一次都查出来吗?? select *, (select content from chat_message where fromUserId = t2.fromUserId and toUserId = (select id from user_info where username='王五') order by id desc limit 1), (select createDate from chat_message where fromUserId = t2.fromUserId and toUserId = (select id from user_info where username='王五') order by id desc limit 1) from user_info t1 right join (select distinct fromUserId from chat_message where toUserid = (select id from user_info where username='王五') order by id desc limit 2) t2 on t1.id = t2.fromUserId
youfeng445 2013-07-04
  • 打赏
  • 举报
回复
引用 7 楼 LeeHomWong 的回复:
select * from chart where toUserId =(select id from user where name="") order by create_time desc limit 5
这个只是单单将聊天记录查出来了,没有用户的信息
24K純帥 2013-07-04
  • 打赏
  • 举报
回复
select * from chart where toUserId =(select id from user where name="") order by create_time desc limit 5
youfeng445 2013-07-04
  • 打赏
  • 举报
回复
引用 5 楼 oh_Maxy 的回复:
select content from 聊天表 where fromUserId='目标用户ID' union select first 5 content from 聊天表 where toUserId='目标用户ID' order by date desc;
不是查最新的5条记录,是查和目标用户聊过天的最新5个用户信息和他们发表的最后一条记录的内容和时间; ----------------------------- 以下是简单的数据样例: 查询和王五聊天过的(王五主动发送,或者被动接收的都算)最后2个用户的信息,以及最后那2条信息的内容和发表时间

/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50168
Source Host           : localhost:3306
Source Database       : chat

Target Server Type    : MYSQL
Target Server Version : 50168
File Encoding         : 65001

Date: 2013-07-04 15:41:14
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for `chat_message`
-- ----------------------------
DROP TABLE IF EXISTS `chat_message`;
CREATE TABLE `chat_message` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `fromUserId` bigint(20) NOT NULL,
  `toUserId` bigint(20) NOT NULL,
  `content` varchar(255) NOT NULL,
  `createDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=40 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of chat_message
-- ----------------------------
INSERT INTO `chat_message` VALUES ('1', '1', '2', '张三到李四1', '2013-07-04 15:32:40');
INSERT INTO `chat_message` VALUES ('2', '1', '3', '张三到王五1', '2013-07-04 15:33:04');
INSERT INTO `chat_message` VALUES ('3', '1', '4', '张三到赵六1', '2013-07-04 15:34:39');
INSERT INTO `chat_message` VALUES ('4', '2', '1', '消息....112', '2013-07-04 15:38:56');
INSERT INTO `chat_message` VALUES ('5', '2', '3', '消息....113', '2013-07-04 15:38:56');
INSERT INTO `chat_message` VALUES ('6', '2', '4', '消息....114', '2013-07-04 15:38:56');
INSERT INTO `chat_message` VALUES ('7', '2', '5', '消息....115', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('8', '3', '1', '消息....116', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('9', '3', '2', '消息....117', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('10', '3', '4', '消息....118', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('11', '3', '5', '消息....119', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('12', '4', '1', '消息....120', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('13', '4', '2', '消息....121', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('14', '4', '3', '消息....122', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('15', '4', '5', '消息....123', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('16', '5', '1', '消息....124', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('17', '5', '2', '消息....125', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('18', '5', '4', '消息....126', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('19', '5', '3', '消息....127', '2013-07-04 15:38:57');
INSERT INTO `chat_message` VALUES ('20', '1', '2', '消息....1', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('21', '1', '3', '消息....2', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('22', '1', '4', '消息....3', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('23', '1', '5', '消息....4', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('24', '2', '1', '消息....5', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('25', '2', '3', '消息....6', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('26', '2', '4', '消息....7', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('27', '2', '5', '消息....8', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('28', '3', '1', '消息....9', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('29', '3', '2', '消息....10', '2013-07-04 15:40:36');
INSERT INTO `chat_message` VALUES ('30', '3', '4', '消息....11', '2013-07-04 15:40:37');
INSERT INTO `chat_message` VALUES ('31', '3', '5', '消息....12', '2013-07-04 15:40:37');
INSERT INTO `chat_message` VALUES ('32', '4', '1', '消息....13', '2013-07-04 15:40:37');
INSERT INTO `chat_message` VALUES ('33', '4', '2', '消息....14', '2013-07-04 15:40:37');
INSERT INTO `chat_message` VALUES ('34', '4', '3', '消息....15', '2013-07-04 15:40:37');
INSERT INTO `chat_message` VALUES ('35', '4', '5', '消息....16', '2013-07-04 15:40:37');
INSERT INTO `chat_message` VALUES ('36', '5', '1', '消息....17', '2013-07-04 15:40:37');
INSERT INTO `chat_message` VALUES ('37', '5', '2', '消息....18', '2013-07-04 15:40:37');
INSERT INTO `chat_message` VALUES ('38', '5', '4', '消息....19', '2013-07-04 15:40:37');
INSERT INTO `chat_message` VALUES ('39', '5', '3', '消息....20', '2013-07-04 15:40:37');

-- ----------------------------
-- Table structure for `user_info`
-- ----------------------------
DROP TABLE IF EXISTS `user_info`;
CREATE TABLE `user_info` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user_info
-- ----------------------------
INSERT INTO `user_info` VALUES ('1', '张三');
INSERT INTO `user_info` VALUES ('2', '李四');
INSERT INTO `user_info` VALUES ('3', '王五');
INSERT INTO `user_info` VALUES ('4', '赵六');
INSERT INTO `user_info` VALUES ('5', '丁七');

oh_Maxy 2013-07-04
  • 打赏
  • 举报
回复
select content from 聊天表 where fromUserId='目标用户ID' union select first 5 content from 聊天表 where toUserId='目标用户ID' order by date desc;
youfeng445 2013-07-04
  • 打赏
  • 举报
回复
引用 3 楼 youfeng445 的回复:
[quote=引用 2 楼 ljc19901124 的回复:] 当前用户发过信息,过着发信息给过当前用户的最后5个用户信息,以及最后发表的那条信息的内容 第二个条件写的太含糊了,再重新写一遍
写错了,应该是: 当前用户发过信息,或者给当前用户发过信息的最后5个用户信息, 以及最后发表的那条信息的内容 [/quote] 就是查双方互发过信息的最后5个用户信息,以及最后那条消息内容,发表时间
youfeng445 2013-07-04
  • 打赏
  • 举报
回复
引用 2 楼 ljc19901124 的回复:
当前用户发过信息,过着发信息给过当前用户的最后5个用户信息,以及最后发表的那条信息的内容 第二个条件写的太含糊了,再重新写一遍
写错了,应该是: 当前用户发过信息,或者给当前用户发过信息的最后5个用户信息, 以及最后发表的那条信息的内容
爱T 2013-07-04
  • 打赏
  • 举报
回复
当前用户发过信息,过着发信息给过当前用户的最后5个用户信息,以及最后发表的那条信息的内容 第二个条件写的太含糊了,再重新写一遍
小丑哥_V5 2013-07-04
  • 打赏
  • 举报
回复

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧