php - 选择不同表的两列之间的差/减

标签 php mysql sql join pdo

我正在尝试计算一条消息是否已看到/未看到以及已读/未读。

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 而不是改变值,所以排序会更容易,但如果这不可能,我原来的方法就足够了。

最佳答案

尝试使用 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

关于php - 选择不同表的两列之间的差/减,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37660214/

相关文章:

php - 获取 404 未找到 Laravel POST 请求

php - 比较四个字符的字符串时,有什么简单的方法可以检查两个或多个字符是否相等?

php - 如何避免在邮件功能中显示 HTML 标签

php - JSON 的行内行

mysql - 将 plsql 函数的值复制到新表中

PHP:在嵌套的foreach循环中动态显示用户的id

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - SQL where 子句中的否定

sql - 根据列值动态决定连接表

sql - 迭代删除重复记录