2014-10-01 56 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

相關問題