簡體   English   中英

MySQL從多個表中選擇值取決於一個中的最新值

[英]MySQL select values from Multiple Tables dependent on latest value in one

我有以下三個表來照顧小型Web應用程序中的支持票,但我需要一些幫助來獲取所需的數據。

表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

第一個表保存關鍵票證信息,第二個表保存對相應票證的所有答復,第三個表跟蹤狀態的變化(狀態保存在另一個表中,但是不需要任何其他信息)。

我需要做的是獲取最新狀態為== 40的票證數量,如果該數量大於0,請獲取最新答復以及來自第一個表的數據。

我已經嘗試了多種方法來執行此操作,但是我陷入了困境。 真的不想在這里粘貼它們,因為它們可能會使人們感到困惑,而且我懷疑他們是否接近。

這是一個相當棘手的問題,但是這里有一個適合您的解決方案。

該查詢將獲取所有最新status_ID為40的票證的最新support_reply值。

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

您可以嘗試以下一種方法:

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;

從給出的示例中,看起來所有時間戳都是等效的,因此這樣的查詢就足夠了:

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: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;

請看這里的小提琴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM