MySQL根据来自两个表的两个时间戳对数据进行排序

问题描述 投票:-1回答:1

因此,让我们以大家使用的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表中的第二个新匹配项,或者是消息表中较早发送/接收的新消息。最重要的是,新的匹配项或消息,最接近的是最新的。现在没有发生。请帮助。

mysql sql
1个回答
0
投票

不是冒名顶替者;评论太久,将被删除...

您可以通过单击“编辑”,并提供所需的结果来使问题更清晰,例如:

+--------+----------+---------------------+-----------+-----------+---------------------+-----------+------------------------------------+
| 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                |
+--------+----------+---------------------+-----------+-----------+---------------------+-----------+------------------------------------+
© www.soinside.com 2019 - 2024. All rights reserved.