因此,让我们以大家使用的Tinder或Tantan为例。在他们的消息部分中,发生的情况是,每当有新的匹配项时,消息框列表都会更新,并在顶部带有新记录的新记录显示“这是新匹配项”,点击它就可以聊天。如果您以后再收到其他用户的新消息,则该消息将排在列表顶部。来自任何用户的任何新消息都将被排在列表的顶部,因为它是最新的消息,如果任何新匹配项是最新出现的消息,则也将被排在列表的顶部。我们都知道这是如何运作的?我想实现完全相同的事情。此处的匹配项从swipes
表中进行排序,并从messages
表中进行消息排序。两个表都有一个时间戳。现在,根据时间戳记,无论是第一次发生的事件还是最近发生的事件,都应该放在列表的顶部。那是我唯一想要实现的。
现在正在发生什么?
当前,无论是匹配还是新消息,它都没有按照最近的活动进行排序。
预期结果
[如果是最近的比赛,则应该在最上面说“这是一场新比赛”或其他内容。或者,如果一条消息是最新的(无论发送还是接收),则应将其放在最前面。
样本数据
CREATE TABLE `display_photos` (
`dp_id` bigint(20) NOT NULL,
`dp_mem` bigint(20) NOT NULL,
`dp_photo` varchar(255) NOT NULL,
`dp_index` int(11) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `display_photos` (`dp_id`, `dp_mem`, `dp_photo`, `dp_index`) VALUES
(1, 1, 'man.jpg', 1),
(2, 8, 'girl.png', 1),
(3, 11, 'girl2.jpg', 1),
(4, 11, 'girl.png', 2);
CREATE TABLE `members` (
`mem_id` bigint(20) NOT NULL,
`mem_fname` varchar(255) NOT NULL,
`mem_lname` varchar(255) NOT NULL,
`mem_last_activity` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `members` (`mem_id`, `mem_fname`, `mem_lname`, `mem_last_activity`) VALUES
(1, 'Shreyansh', 'Jha', '2020-04-17 23:06:59'),
(8, 'Priyanka', 'Jaiswal', '2020-04-14 23:25:00'),
(11, 'Radhika', 'Apte', '2020-04-14 23:26:00');
CREATE TABLE `messages` (
`msg_id` bigint(20) NOT NULL,
`msg_from` bigint(20) NOT NULL,
`msg_to` bigint(20) NOT NULL,
`msg_message` longtext NOT NULL,
`msg_seen` enum('yes','no') NOT NULL DEFAULT 'no',
`msg_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `messages` (`msg_id`, `msg_from`, `msg_to`, `msg_message`, `msg_seen`, `msg_time`) VALUES
(1, 11, 1, 'How are you?', 'yes', '2020-04-14 21:01:05'),
(2, 1, 11, 'I am fine.. you?', 'no', '2020-04-14 20:54:07'),
(3, 1, 11, 'Thik hun... Tum batao..', 'yes', '2020-04-14 21:16:05'),
(4, 8, 1, 'Okay', 'yes', '2020-04-16 09:16:39'),
(5, 11, 1, 'Are you there?', 'yes', '2020-04-18 00:12:35');
CREATE TABLE `swipes` (
`swp_id` bigint(20) NOT NULL,
`swp_by` bigint(20) NOT NULL,
`swp_to` bigint(20) NOT NULL,
`swp_type` varchar(255) NOT NULL,
`swp_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO `swipes` (`swp_id`, `swp_by`, `swp_to`, `swp_type`, `swp_date`) VALUES
(6, 8, 1, 'top', '2020-03-23 21:09:12'),
(33, 11, 1, 'right', '2020-04-12 21:07:58'),
(49, 1, 11, 'right', '2020-04-14 18:28:29'),
(50, 1, 8, 'top', '2020-04-18 00:10:00');
ALTER TABLE `display_photos`
ADD PRIMARY KEY (`dp_id`);
ALTER TABLE `members`
ADD PRIMARY KEY (`mem_id`);
ALTER TABLE `messages`
ADD PRIMARY KEY (`msg_id`);
ALTER TABLE `swipes`
ADD PRIMARY KEY (`swp_id`);
查询
SELECT R1.swp_to
, R1.swp_type
, R1.swp_date
, M.mem_fname
, M.mem_lname
, M.mem_last_activity
, DP.dp_photo
, GREATEST(R1.swp_date, R2.swp_date)
FROM swipes R1
LEFT
JOIN swipes R2
ON R1.swp_to = R2.swp_by
AND R2.swp_to = R1.swp_by
AND R2.swp_type <> 'left'
LEFT
JOIN members M ON R1.swp_to = M.mem_id
LEFT
JOIN display_photos DP
ON R1.swp_to = DP.dp_mem
AND DP.dp_index = 1
LEFT
JOIN messages MSG
ON (
( R1.swp_to = MSG.msg_from AND R1.swp_to = MSG.msg_to )
OR
( R1.swp_by = MSG.msg_from AND R1.swp_by = MSG.msg_to )
)
WHERE R1.swp_by = 1
AND R2.swp_by IS NOT NULL
AND R1.swp_type <> 'left'
ORDER
BY GREATEST(MSG.msg_time, R1.swp_date) DESC;
+--------+----------+---------------------+-----------+-----------+---------------------+-----------+------------------------------------+
| swp_to | swp_type | swp_date | mem_fname | mem_lname | mem_last_activity | dp_photo | GREATEST(R1.swp_date, R2.swp_date) |
+--------+----------+---------------------+-----------+-----------+---------------------+-----------+------------------------------------+
| 8 | top | 2020-04-18 00:10:00 | Priyanka | Jaiswal | 2020-04-14 23:25:00 | girl.png | 2020-04-18 00:10:00 |
| 11 | right | 2020-04-14 18:28:29 | Radhika | Apte | 2020-04-14 23:26:00 | girl2.jpg | 2020-04-14 18:28:29 |
+--------+----------+---------------------+-----------+-----------+---------------------+-----------+------------------------------------+
2 rows in set (0.01 sec)
在这里拨:SQL Fiddle
[在上面的小提琴中,您可以看到messages
表中的第5条记录与swipes
表中的第4条记录相比,具有基于用户1和11的最新时间戳。相差2分钟。考虑到这里的用户1是我,而用户11是我正在与之聊天的用户,他的记录应该在最上面,因为它是最新消息,但当前在最下面。如果稍后我突然根据与[message]表相比其swp_date
字段具有最新时间戳的滑动表获得了新匹配,则该记录应位于顶部,然后是基于日期和时间的下一条记录,无论是否是swipes
表中的第二个新匹配项,或者是消息表中较早发送/接收的新消息。最重要的是,新的匹配项或消息,最接近的是最新的。现在没有发生。请帮助。
不是冒名顶替者;评论太久,将被删除...
您可以通过单击“编辑”,并提供所需的结果来使问题更清晰,例如:
+--------+----------+---------------------+-----------+-----------+---------------------+-----------+------------------------------------+
| swp_to | swp_type | swp_date | mem_fname | mem_lname | mem_last_activity | dp_photo | GREATEST(R1.swp_date, R2.swp_date) |
+--------+----------+---------------------+-----------+-----------+---------------------+-----------+------------------------------------+
| 11 | right | 2020-04-14 18:28:29 | Radhika | Apte | 2020-04-14 23:26:00 | girl2.jpg | 2020-04-14 18:28:29 |
| 8 | top | 2020-04-18 00:10:00 | Priyanka | Jaiswal | 2020-04-14 23:25:00 | girl.png | 2020-04-18 00:10:00 |
+--------+----------+---------------------+-----------+-----------+---------------------+-----------+------------------------------------+