【问题标题】:Select difference/minus between two columns of different tables选择不同表的两列之间的差/减
【发布时间】:2016-06-06 14:36:29
【问题描述】:

我正在尝试计算一条消息是否可见/不可见和已读/未读。

data_chats_parties表中有两个字段last_seenlast_read

data_chats_messages 表中,有一个字段created 表示消息的创建时间。

我需要从created 中的时间戳中减去last_seenlast_read 中的时间戳。

在对同一个表的列执行数学运算时查询工作正常,但是当我使用不同的表时,它返回一个空结果。

这是我现有的查询:

  SELECT
        data_chats.id AS chat,
        data_chats_parties.*,
       (SELECT COUNT(data_chats_parties.id) FROM data_chats_parties
        WHERE data_chats_parties.chat = data_chats.id) AS total_parties,
        data_chats_messages.created AS last_message_created,
        data_chats_messages.author AS last_message_author,
        data_chats_messages.author_type AS last_message_author_type,
        data_chats_messages.message AS last_message,

        (data_chats_messages.created - data_chats_parties.last_seen) AS unseen,
        (data_chats_messages.created - data_chats_parties.last_read) AS unread

      FROM data_chats
        INNER JOIN data_chats_parties ON data_chats_parties.chat=data_chats.id
        LEFT JOIN data_chats_messages ON data_chats_messages.chat=data_chats.id AND data_chats_messages.active=1
      WHERE
        data_chats.active=1 AND
        data_chats_parties.member=1 AND
        data_chats_parties.status >= 1
      GROUP BY data_chats_parties.chat
      ORDER BY last_message_created DESC

假设此查询按计划工作,如果 unreadunseen> 0,则它是看不见的或未读的。

理想情况下,我可以将 unreadunseen 设置为 10 而不是改变值,这样排序会更容易,但如果这不可能,我的原始方法就足够了。

【问题讨论】:

    标签: php mysql sql join pdo


    【解决方案1】:

    尝试使用IF,如下所示:

    SELECT
        data_chats.id AS chat,
        data_chats_parties.*,
       (SELECT COUNT(data_chats_parties.id) FROM data_chats_parties
        WHERE data_chats_parties.chat = data_chats.id) AS total_parties,
        data_chats_messages.created AS last_message_created,
        data_chats_messages.author AS last_message_author,
        data_chats_messages.author_type AS last_message_author_type,
        data_chats_messages.message AS last_message,
    
        IF(data_chats_messages.created > data_chats_parties.last_seen,1,0) AS unseen,
        IF(data_chats_messages.created > data_chats_parties.last_read,1,0) AS unread
    
      FROM data_chats
        INNER JOIN data_chats_parties ON data_chats_parties.chat=data_chats.id
        LEFT JOIN data_chats_messages ON data_chats_messages.chat=data_chats.id AND data_chats_messages.active=1
      WHERE
        data_chats.active=1 AND
        data_chats_parties.member=1 AND
        data_chats_parties.status >= 1
      GROUP BY data_chats_parties.chat
      ORDER BY last_message_created DESC
    

    【讨论】:

      猜你喜欢
      • 2013-05-02
      • 1970-01-01
      • 2020-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-06
      • 1970-01-01
      相关资源
      最近更新 更多