我有2张桌子,票证和ticket_custom 以下是表格的设置方式。
我有一个Web界面,我可以在其中更改状态(表ticket_custom中的值)Web界面添加新条目而不是更新原始条目。
ticket name value
1 state Ready for Final Verification
2 state Ready for Final Verification
1 state Verified
添加最后一行
所以我需要修改查询。
SELECT p.value AS __color__,
id AS ticket, summary, component, version, c.value AS state, milestone, t.type AS type,
owner, status,
time AS created,
changetime AS _changetime, description AS _description,
reporter AS _reporter
FROM ticket t, ticket_custom c
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' AND id = c.ticket
WHERE status <> 'closed' AND id = c.ticket
ORDER BY CAST(p.value AS int), milestone, t.type, time, c.ticket
查询现在返回两个条目。我试图在where子句中添加嵌套选择。
SELECT g.ticket
FROM ticket_custom g
WHERE g.ticket = id
ORDER BY g.ticket DESC LIMIT 1
所以 -
SELECT p.value AS __color__,
id AS ticket, summary, component, version, c.value AS state, milestone, t.type AS type,
owner, status,
time AS created,
changetime AS _changetime, description AS _description,
reporter AS _reporter
FROM ticket t, ticket_custom c
LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority' AND id = c.ticket
WHERE status <> 'closed' AND id = c.ticket and (
SELECT g.ticket
FROM ticket_custom g
WHERE g.ticket = id
ORDER BY g.ticket DESC LIMIT 1 )
ORDER BY CAST(p.value AS int), milestone, t.type, time, c.ticket
显然我做错了什么。
答案 0 :(得分:2)
这似乎更像是设计问题,而不是查询问题。虽然可以从ticket_custom表中仅返回单个记录,但是无法确定将记录哪条记录。在您的示例表中,票证1的值为“Ready for ...”和“Verified”,但没有显示最先发生的事件。从逻辑上讲,“准备好......”首先发生了。
解决此问题的最简单方法是添加时间戳或递增ID字段。然后您的子查询可以选择最新的条目(最新时间戳或最高ID)。
答案 1 :(得分:1)
假设至少有一张票,你可以这样做:
SELECT MAX(g.ticket) 来自ticket_custom g 在哪里g.ticket = id
您可以将其转换为JOIN或嵌套的SELECT等。
所以改变id = c.ticket id = MAX(c.ticket)
但请检查你的WHERE&amp; LEFT JOIN那里有一些奇怪的东西。
答案 2 :(得分:0)
不要使数据库架构动态化(即“表驱动”)。这不是一种明智的设计模式(我从经验中知道)。它在创建其他属性时只需要节省一点费用,但之后会产生额外的开销,包括编写查询和执行它们所需的数据库处理。
只需将状态ID列添加到故障单表,并在状态更改时更新它。创建一个存储状态名称的引用表。然后,您的查询变得非常简单,并且数据库引擎需要更少的工作量来建立到小型参考表的索引连接。