SQL - 嵌套的select语句?

时间:2009-04-24 19:08:27

标签: sql nested

我有2张桌子,票证和ticket_custom 以下是表格的设置方式。alt text

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

显然我做错了什么。

3 个答案:

答案 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列添加到故障单表,并在状态更改时更新它。创建一个存储状态名称的引用表。然后,您的查询变得非常简单,并且数据库引擎需要更少的工作量来建立到小型参考表的索引连接。