我的问题是我有一个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中的输出如下
正如你所看到的那样我用他们的id和tid绑定了表格,这很好用,但是它向我展示了许多结果,它向我展示了许多r.replies,当我只想看到它时,它是“Ticket Replies”第一个。
我知道我可以做“GROUP BY t.date”并限制它只显示
哪个好看,但这是我的问题。你看到两个时间戳,一个是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
正如您所看到的,此代码仅执行的操作是首先跳过任何没有超过票证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。
我希望我像一个理智的人一样。
答案 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,然后使用它们。
我希望我能更好地理解你的要求。