如何显示结果,限制第二个表并查看时差

时间:2017-09-14 12:39:01

标签: mysql sql datetime

我的问题是我有一个SQL查询

SELECT t.id
     , t.title
     , t.message
     , t.date
     , r.tid
     , r.admin
     , r.message
     , r.date 
  FROM tbltickets t
     , tblticketreplies r 
 WHERE t.id = r.tid 
   AND t.date BETWEEN '2017-09-01 00:00:00' AND '2017-09-14 00:00:00'

运行此操作时,phpMyAdmin中的输出如下

enter image description here

正如你所看到的那样我用他们的id和tid绑定了表格,这很好用,但是它向我展示了许多结果,它向我展示了许多r.replies,当我只想看到它时,它是“Ticket Replies”第一个。

我知道我可以做“GR​​OUP BY t.date”并限制它只显示

enter image description here

哪个好看,但这是我的问题。你看到两个时间戳,一个是t.date,另一个是r.date。

我现在想要做的只是过滤结果,其中r.date比t.date(比左边的票据日期)早24小时以上,问题是当我运行类似DATE_ADD的时候我将跳转到“下一个r.message,因为我将其分组为t.date。它只会隐藏您在屏幕截图#1中看到的消息,其中显示”您好,感谢您联系支持“并将像此

SELECT t.id, t.title, t.message, t.date, r.tid, r.admin, r.message, r.date FROM tbltickets t, tblticketreplies r WHERE t.id = r.tid AND t.date BETWEEN '2017-09-01 00:00:00' AND '2017-09-14 00:00:00' AND r.date > DATE_ADD(t.date, INTERVAL 1 DAY) GROUP BY t.date

enter image description here

正如您所看到的,此代码仅执行的操作是首先跳过任何没有超过票证DATE本身标记1天的回复的票证,但是留下的任何票证都会跳过第一条消息回复,直到它从故障单日期发现超过1天的消息回复

票务日期:10.sept 机票有5.replies,所有这些都是同一天,除了1。

结果显示T.message和T.date然后只是R.message和R.date跳过前4个。

我的目标是从r.date比t.date早1天以上的结果中完全删除票证,但它必须是第一个回复的第一个r.date,如第1次回复所示,在分组之前由t分组.date。

我希望我像一个理智的人一样。

1 个答案:

答案 0 :(得分:2)

一些事情。首先,您使用旧的连接语法。它具有复古,20世纪80年代的感觉。这样做。

   FROM tbltickets t
   JOIN tblticketreplies r  ON t.id = r.tid

其次,您的日期过滤器不正确。 (在日期过滤器中使用BETWEEN几乎永远不会正确,因为它会影响范围结束条件。)它会在'2017-09-14 00:00:00'的午夜获取项目,但不会在之后。如果您想在9月9日之前完成任何事情而且在14月9日没有任何内容可以使用。

     AND t.date >= '2017-09-01 00:00:00' 
     AND t.date <  '2017-09-14 00:00:00' 

进行这些修复可以帮助您解决问题。

接下来,您需要创建一个子查询来识别&#34; first&#34;回复每张票看起来像这样

           SELECT MIN(r.id) id, r.tid
             FROM tbltickets t
             JOIN tblticketreplies r
                        ON t.id = r.tid
                       AND r.date >= t.date + INTERVAL 24 HOUR
            GROUP BY r.tid

此处AND子句的ON部分排除了超过24小时的回复。 它为每tid提供零行或一行。 (这很重要!)它会在回复表中为您提供最新行的id值,该值大于24小时。

您可以测试此查询并确保它符合您的预期。

最后,在主查询中使用它

SELECT t.id, t.title, t.message, t.date,
       r.tid, r.admin, r.message reply, r.date reply_date 
  FROM tbltickets t
  JOIN tblticketreplies r ON t.id = r.tid
  JOIN (
               SELECT MIN(r.id) id, r.tid
                 FROM tbltickets t
                 JOIN tblticketreplies r
                            ON t.id = r.tid
                           AND r.date >= t.date + INTERVAL 24 HOUR
                GROUP BY r.tid
       ) latest ON r.id = latest.id AND t.id = latest.tid
 WHERE t.date >= '2017-09-01 00:00:00' 
   AND t.date <  '2017-09-14 00:00:00'

第二个JOIN会删除结果集中符合条件的所有行。

如果您需要显示所有故障单,即使是那些缺少符合条件的回复的故障单,也请使用LEFT JOIN代替两个JOIN操作。

修改以上内容会删除超过24小时的回复。我想我误解了这个要求。对于那个很抱歉。我仍然无法理解要求。

如果您想要在24小时内没有回复的情况下显示每张票,您可以这样做。

1)弄清楚每张票的最新回复是什么时候。这为每张票提供了date最近的响应。

               SELECT MAX(date) date, r.tid
                 FROM tbltickets t
                 JOIN tblticketreplies r
                            ON t.id = r.tid
                GROUP BY r.tid

2)将子查询加入主查询

 SELECT t.id, t.title, t.message, t.date,
       r.tid, r.admin, r.message reply, r.date reply_date 
  FROM tbltickets t
  JOIN tblticketreplies r ON t.id = r.tid
  JOIN (
               SELECT MIN(r.id) id, r.tid
                 FROM tbltickets t
                 JOIN tblticketreplies r
                            ON t.id = r.tid
                           AND r.date >= t.date + INTERVAL 24 HOUR
                GROUP BY r.tid
       ) latest ON r.id = latest.id AND t.id = latest.tid
  JOIN (
               SELECT MAX(date) date, r.tid
                 FROM tbltickets t
                 JOIN tblticketreplies r
                            ON t.id = r.tid
                GROUP BY r.tid
       ) recent ON t.id = recent.tid
 WHERE t.date >= '2017-09-01 00:00:00' 
   AND t.date <  '2017-09-14 00:00:00'
   AND t.date < recent.date + INTERVAL 24 HOUR

那应该扔掉最近24小时响应的门票。总体诀窍是使用GROUP BY子查询来确定您需要的聚合内容,例如最近的日期和最近的最近的ID,然后使用它们。

我希望我能更好地理解你的要求。