如何计算特定行后的行?

时间:2017-08-16 09:53:20

标签: mysql sql

我的网站用户(始终在两个用户之间)之间有联系机制。用户A(发送者)可以根据两个规则向用户B(接收者)发送消息:

  1. 用户A可以向用户B发送2条消息,他必须至少收到一条来自用户B的消息,才能发送另一条消息。

  2. 用户A可以在每天的时间内向每个人发送4条消息,而不是更多。

  3. 这是我的表结构:

    #For example (< Android Nougat):
    myTextView.setText(Html.fromHtml("&#269;"));
    
    
    #For example (>= Android Nougat):    
    myTextView.setText(Html.fromHtml("&#269;", Html.FROM_HTML_MODE_COMPACT));
    

    这是我目前的疑问:

    -- contact
    +----+-----------+------------+--------------------------+------------+
    | id | sender_id | receive_id |          message         |  date_time |
    +----+-----------+------------+--------------------------+------------+
    | 1  | 123       | 456        | Hi, how are you?         | 1492431111 |
    | 2  | 123       | 789        | How are you doing?       | 1492431112 |
    | 3  | 456       | 789        | Why would you say that?  | 1492431113 |
    | 4  | 123       | 456        | Why don't you answer?    | 1492431114 |
    | 5  | 789       | 456        | Because the sky is high  | 1492431115 |
    | 6  | 123       | 789        | Hello?                   | 1492431116 | 
    +----+-----------+------------+--------------------------+------------+
    

    如您所见,我的查询中只实现了第二条规则。我怎样才能为查询实现第一条规则?

2 个答案:

答案 0 :(得分:0)

查询以查找来自&#39; A&#39;的消息数量。到&#39; B&#39;自上次回复以来:

SELECT count(*)
FROM contact
WHERE sender_id = 'A'
  AND receive_id = 'B'
  AND date_time > (
    SELECT max(date_time)
    FROM contact
    WHERE sender_id = 'B'
      AND receive_id = 'A'
    )

请注意,如果没有“B&#39; B&#39;到&#39; A&#39;但是 - 你必须修改查询以解决这个问题。

答案 1 :(得分:0)

我不确定在数据库中实现这个逻辑是一个极好的想法 - 你似乎正在寻找一个只会插入消息A写入的查询,如果他们之前没有联系过B超过两次但是那种在前端应用程序中,逻辑会更好。为此,您最好先处理几个问题:

Select count(*) from contact where sender_id = A and date_time > unix_timestamp(curdate())

如果&gt; = 4

,则拒绝发送消息

运行JiriTousek的查询并拒绝发送,如果它是&gt; = 2

通过拒绝发送,我的意思是改变前端,因此消息传递是不可能的,因此他们不会浪费生命来输入永远不会发送的消息。在插入时执行此阻塞对于那个来说太晚了