2014-10-01 64 views
1

我有以下三张表来关注小型Web应用程序中的支持票据,但我需要一些帮助来获取所需的数据。MySQL从多个表中选择取决于最新值的值在一个

表1(票):

user_ID site_ID support_ID timestamp   priority title 
    12  25   3  2014-09-26 14:09:25 0  A Test Row 
    12  26   4  2014-09-27 09:41:18 0  A 2nd Test Row 

表2(ticket_reply):

reply_ID support_ID user_ID support_reply    reply_timestamp 
    3   3   12 some really boring text 2014-09-26 14:09:25 
    4   3   25 some really boring reply 2014-09-26 15:35:18 
    5   4   12 some really boring text 2014-09-27 09:41:18 

表3(ticket_status):

ticket_status_ID support_ID status_ID status_timestamp 
     3   3   40  2014-09-26 14:09:25 
     4   3   41  2014-09-26 15:35:18 
     5   4   40  2014-09-27 09:41:18 

的第一表是关键票信息,第二个,对相应票据的任何回复,第三个跟踪状态的变化(状态是hel d在另一个表中,但不需要任何东西)。

我需要做的是获取最新状态为== 40的票数,如果大于0,则获取最新的答复以及第一个表中的数据。

我已经尝试了多种方式来做到这一点,但我被卡住了。真的不想把它们粘贴在这里,因为它们可能会让人们感到困惑,我怀疑它们甚至会接近。

+1

你显然理解'要求'是最好的,所以你尝试过的任何'sql查询'都会很有用。他们有时会包括“额外条件”,但不包括在原始问题中。带有示例数据的[SQLFiddle](http://sqlfiddle.com)可能很有用。 – 2014-10-05 22:05:03

+0

你会很快得到你的解决方案。 – 2014-10-05 22:10:16

+0

解决方案发布。我强烈建议使用Navicat软件来构建未来的复杂查询。 – 2014-10-05 22:39:11

回答

3

这一个是相当棘手,但是这里是一个工作的解决方案给你。

该查询将获得所有门票最近support_reply值,其中最近的STATUS_ID是40

SELECT 
    ticket_status_ID, 
    support_ID, 
    status_ID, 
    status_timestamp, 
    reply_ID, 
    support_reply, 
    reply_timestamp, 
    `timestamp` ticket_timestamp, 
    `priority` ticket_priority, 
    title 
FROM (
    SELECT * FROM (
     SELECT * FROM (
     SELECT 
      ticket_status.ticket_status_ID, 
      ticket_status.support_ID, 
      ticket_status.status_ID, 
      ticket_status.status_timestamp, 
      ts1.reply_ID, 
      ts1.user_ID, 
      ts1.support_reply, 
      ts1.reply_timestamp 
      FROM 
      ticket_status 
      INNER JOIN (SELECT * FROM ticket_reply ORDER BY reply_timestamp DESC) ts1 ON ts1.support_ID = ticket_status.support_ID 
      GROUP BY support_ID, status_ID 
      ORDER BY status_timestamp DESC 
     ) ts2 
     GROUP BY ts2.support_ID 
    ) ts3 
    INNER JOIN (SELECT support_ID as `ticket_support_ID`, site_ID, `timestamp`, priority, title FROM ticket) ts4 ON ts4.ticket_support_ID = ts3.support_ID 
    WHERE ts3.status_ID = 40 
) ts5 
+0

这很接近,但它不返回第一个表中的信息。这里应该更清楚。需要从第一张表 – 2014-10-06 02:03:16

+0

查询中的所有信息进行修改,以包括来自“票据”表的结果列。 – 2014-10-06 04:32:42

+0

真棒,它完美的作品。我稍微修改了一下,所以我可以通过用户获得它,但我当然没有接近它。非常感谢! – 2014-10-06 20:46:32

1

你可以试试这个:

SELECT t.*, tr.support_reply, ts.status_timestamp 
FROM ticket_status as ts 
left join ticket_reply as tr on(ts.support_ID=tr.support_ID) 
left join ticket as t on(t.support_ID=tr.support_ID) 
where status_ID=40 
order by status_timestamp desc 
limit 1; 
1

从例子中给出,它看起来所有的时间戳都是等效的,所以这样的查询应该足够了:

SELECT 
    ticket.*, 
    ticket_reply.* 
FROM 
    (SELECT support_ID, MAX(status_timestamp) as max_timestamp 
    FROM  ticket_status 
    GROUP BY support_ID) m 
    INNER JOIN ticket 
    ON m.support_ID=ticket.support_ID 
    AND m.max_timestamp=ticket.`timestamp` 
    INNER JOIN ticket_reply 
    ON m.support_ID=ticket_reply.support_ID 
    AND m.max_timestamp=ticket_reply.reply_timestamp 
    INNER JOIN ticket_status 
    ON m.support_ID=ticket_status.support_ID 
    AND m.max_timestamp=ticket_status.status_timestamp 
WHERE 
    status_ID=40; 

,但取决于应用程序的逻辑,可能会发生表格中最后一行的时间戳为2014-09-27 09:41:18,而最后一行例如有2014-09-27 09:41:19

在这种情况下,你应该使用的查询像这样的:

SELECT 
    ticket.*, 
    ticket_reply.* 
FROM 
    (SELECT support_ID, MAX(status_timestamp) AS max_status_timestamp 
    FROM  ticket_status 
    GROUP BY support_ID) m_status 
    INNER JOIN 
    (SELECT support_ID, MAX(reply_timestamp) AS max_reply_timestamp 
    FROM  ticket_reply 
    GROUP BY support_ID) m_reply 
    ON m_status.support_ID=m_reply.support_ID 
    INNER JOIN 
    (SELECT support_ID, MAX(`timestamp`) AS max_ticket_timestamp 
    FROM  ticket 
    GROUP BY support_ID) m_ticket 
    ON m_status.support_ID=m_ticket.support_ID 

    INNER JOIN ticket_status 
    ON ticket_status.support_ID=m_status.support_ID 
    AND ticket_status.status_timestamp=m_status.max_status_timestamp 

    INNER JOIN ticket_reply 
    ON ticket_reply.support_ID=m_reply.support_ID 
    AND ticket_reply.reply_timestamp=m_reply.max_reply_timestamp 

    INNER JOIN ticket 
    ON ticket.support_ID=m_ticket.support_ID 
    AND ticket.`timestamp`=m_ticket.max_ticket_timestamp 
WHERE 
    ticket_status.status_ID=40; 

请参阅小提琴here

相关问题