我有一张显示工作票的表,基本上是这样的:
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
列。
谢谢!
答案 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_id
和xref_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
);