【问题标题】:mysql query - date subtractionmysql查询-日期减法
【发布时间】:2017-02-02 12:26:15
【问题描述】:
  • 我正在尝试查询过去 3 年内活跃的用户。
  • 我正在调整我多年来一直使用的查询,我知道它可以正常工作。我试图添加的查询的唯一部分是格雷码之外的部分。我无法正确理解这部分。
  • 我正在查询 (lastactivity) 日期的列以 int(10) 格式存储,我认为我不会更改它,因为它是一个 VBulletin 列,我不希望该更改影响还有很多其他问题。

$query = "SELECT user.userid AS id3, user.lastactivity AS lastactivity1, DATE_FORMAT(FROM_UNIXTIME(user.lastactivity), '%Y %m %d') AS 'lastactivity2', socialgroup.groupid AS id1, socialgroupicon.groupid AS id2, socialgroupicon.dateline AS picdate, name, zip1, city1, state1, socialgroup.dateline AS groupdate, creatoruserid, members, picturecount, visible, paid FROM socialgroup LEFT JOIN socialgroupicon ON socialgroupicon.groupid=socialgroup.groupid LEFT JOIN user ON user.userid=socialgroup.creatoruserid WHERE type != 'inviteonly' AND state1 = '$region' AND lastactivity2 ORDER BY paid DESC, lastactivity2 DESC, id1 ASC LIMIT 100 ";

【问题讨论】:

  • 请注意,如果 lastactivity2 来自 user 表,则两个 LEFT JOIN 都将转换为 INNER JOIN。
  • 我认为 LEFT JOINS 可能是个问题 - 确实如此。因此,我将其中一个 LEFT JOIN 更改为 INNER JOIN,并将另一个保留为 LEFT JOIN。我不得不不理会它,因为它正在过滤掉查询中的一些条目。我还必须切换它,所以我列出了 INNER JOIN 在代码中首先列出,而 LEFT JOIN 按顺序排列在第二位。谢谢。

标签: mysql


【解决方案1】:

如果您尝试获取过去 3 年内活跃的条目,您的比较应该大于:

lastactivity2 > UNIX_TIMESTAMP(DATE_SUB(now(), INTERVAL 3 YEAR)) 

时间向前发展,新时代比旧时代更多。

您可能认为您想将 3 年与今天和上次活动之间的时间间隔进行比较,但您是在比较绝对时间戳,而不是差异。

【讨论】:

    【解决方案2】:

    解决方案是我需要将用户表上的 LEFT JOIN 更改为 INNER JOIN,因为我添加到 WHERE 子句的 lastactivity 列位于该表中。 (我还需要将其更改为“lastactivity”而不是“lastactivity2”)。

    $query = "SELECT user.userid AS id3, user.lastactivity AS lastactivity1, DATE_FORMAT(FROM_UNIXTIME(user.lastactivity), '%Y %m %d') AS 'lastactivity2', socialgroup.groupid AS id1, socialgroupicon.groupid AS id2, socialgroupicon.dateline AS picdate, name, zip1, city1, state1, socialgroup.dateline AS groupdate, creatoruserid, members, picturecount, visible, paid FROM socialgroup INNER JOIN user ON user.userid=socialgroup.creatoruserid LEFT JOIN socialgroupicon ON socialgroupicon.groupid=socialgroup.groupid WHERE type != 'inviteonly' AND state1 = '$region' AND lastactivity > UNIX_TIMESTAMP(DATE_SUB(now(), INTERVAL 3 YEAR)) ORDER BY paid DESC, lastactivity2 DESC, id1 ASC LIMIT 100 ";

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-17
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-01
      • 2011-04-23
      • 2020-10-19
      相关资源
      最近更新 更多