2009-04-24 166 views
0

我有2张表,ticket和ticket_custom。
下面是如何设置表格。 alt textSQL - 嵌套select语句?

我有一个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。

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 

显然,我做错了什么。

回答

1

假定至少一票,你可以这样做,而不是:

SELECT MAX(g.ticket) FROM ticket_custom摹 WHERE g.ticket = ID

您可以在转换为连接或嵌套SELECT等

所以更改ID = c.ticket ID = MAX(c.ticket)

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

+0

我同意,你应该能够完全摆脱你的子查询 – 2009-04-24 19:38:15

2

这似乎是一个设计问题而不是查询问题。虽然可以仅从ticket_custom表中返回单个记录,但是没有办法确定哪个记录是。在你样品台票1有一个值“准备...”和“验证”,但没有任何显示哪一个先发生。从逻辑上讲,“准备......”首先发生。

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

0

不要使数据库模式变为动态(即“表驱动”)。这不是一个明智的设计模式(我从经验中知道)。它只是在创建附加属性时只保留一点点努力,但是在编写查询和执行它们所需的数据库处理时都会产生额外的开销。

只需将状态ID列添加到故障单表中并在状态更改时进行更新。创建一个参考表来存储状态名称。然后,您的查询变得非常简单,并且需要较少的努力才能使数据库引擎对小型参考表进行索引式连接。

+0

我同意。我无权访问执行插入操作的SQL查询。我只能读取表格中的数据。 – Brad8118 2009-04-27 14:46:53