2009-04-24 211 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