加入最近输入的值

时间:2014-03-03 20:08:05

标签: mysql sql join

我有一张显示工作票的表,基本上是这样的:

TABLE "ticket"
ticket_id INT UNSIGNED AUTO_INCREMENT
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ticket_name VARCHAR(64)

然后我有一张表格显示了票证的可能状态代码列表:

TABLE "status_ticket"
status_id INT UNSIGNED AUTO_INCREMENT
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP
status_name VARCHAR(64)

我还有一张表记录了票证已经或已经拥有的状态的历史记录:

TABLE "xref_ticket_status"
xref_id INT UNSIGNED AUTO_INCREMENT
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ticket_id INT UNSIGNED NOT NULL
status_id INT UNSIGNED NOT NULL

创建故障单后,在故障单的ticket表中创建一个条目,然后在xref_ticket_status表中输入一个条目,通过链接{{ticket表为故障单分配状态1}}表到status_ticket表。状态更改时,会在xref_ticket_status表中生成一个新条目以反映新状态。通过这种方式,我可以获得故障单所具有的每种状态以及分配时的历史记录。 ticket_id表中任何给定xref_ticket_status的最新条目是故障单的当前状态。

我不确定如何将这三张桌子连在一起以获得门票的当前状态。从本质上讲,我想将ticket表加入xref_ticket_status表,其中ticket_id匹配,但created中的最新xref_ticket_status列。

谢谢!

2 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

select ti.ticket_id,ti.ticket_name,
xr.created, st.status_name
from ticket ti
inner join xref_ticket_status xr
on(ti.ticket_id = xr.ticket_id)
inner join status_ticket st
on(xr.status_id = st.status_id)
group by ti.ticket
order by xr.xref_id desc;

===============更新==================

select * from
(select ti.ticket_id,ti.ticket_name,
xr.created, st.status_name
from ticket ti
inner join xref_ticket_status xr
on(ti.ticket_id = xr.ticket_id)
inner join status_ticket st
on(xr.status_id = st.status_id)
group by ti.ticket
order by xr.xref_id desc)cs
order by cs.ticket_name desc; //or asc

答案 1 :(得分:0)

以下内容从status_id获取最新的ticket_idxref_ticket_status

select xts.*
from xref_ticket_status xts
where not exists (select 1
                  from xref_ticket_status xts2
                  where xts2.ticket_id = xts.ticket_id and
                        xts2.created > xts.created
                 );

逻辑是:“从xref_ticket_status获取所有行,其中没有具有相同票证ID和更近期创建日期的行”。这将是每张票的最后日期。请注意,您也可以使用xref_id进行比较而不是日期。

其余的只是将表格连在一起并选择所需的列:

select t.*, ts.*, xts.created
from xref_ticket_status xts join
     ticket t
     on xts.ticket_id = t.ticket_id join
     ticket_status ts
     on xts.status_id = ts.status_id
where not exists (select 1
                  from xref_ticket_status xts2
                  where xts2.ticket_id = xts.ticket_id and
                        xts2.created > xts.created
                 );