0

我有 2 张桌子,ticket 和 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

显然我做错了什么。

4

3 回答 3

2

这似乎更像是一个设计问题而不是查询问题。虽然可以从 ticket_custom 表中仅返回一条记录,但无法确定将是哪条记录。在您的示例表中,ticket 1 的值为“Ready for...”和“Verified”,但没有显示首先发生的情况。从逻辑上讲,“准备好……”首先发生。

解决此问题的最简单方法是添加时间戳或递​​增 ID 字段。然后您的子查询可以选择最近的条目(最新的时间戳或最高 ID)。

于 2009-04-24T21:56:11.037 回答
1

假设至少有一张票,您可以这样做:

SELECT MAX(g.ticket) FROM ticket_custom g WHERE g.ticket=id

您可以将其转换为 JOIN 或嵌套的 SELECT 等。

所以改变 id=c.ticket id=MAX(c.ticket)

但检查你的 WHERE & LEFT JOIN 里面有一些奇怪的东西。

于 2009-04-24T19:16:16.053 回答
0

不要使您的数据库模式动态化(即“表驱动”)。这不是一个明智的设计模式(我从经验中知道)。它在创建附加属性方面只节省了一点前期工作量,但之后会产生额外的开销,包括编写查询和执行它们所需的数据库处理。

只需在工单表中添加一个状态 id 列,并在状态更改时更新它。创建一个引用表来存储状态名称。然后您的查询变得非常简单,并且数据库引擎对小型参考表进行索引连接所需的工作量更少。

于 2009-04-24T23:44:12.870 回答