2010-01-26 80 views
0

考慮類似這樣的表格:查找「舊」行

| txn_id | account_id

我想要做一個單一的查詢,它將爲我所有txn_ids的事務處理不是最近的(最高txn_id)account_id的所有事務處理。

該數據庫是MySQL 5.1,所以這可能暗示子選擇周圍的一些限制。

+0

感謝大家的幫助。我認爲MySQL太愚蠢了,無法以足夠的性能提出任何建議,所以我必須做一些醜陋的解決方法,但是我非常感謝幫助。當我在另一個更好的數據庫項目上時,我會使用這些建議。 – Paul

回答

2

如果我理解正確的

SELECT txn_id 
    FROM table 
WHERE txn_id <> (SELECT MAX(txn_id) FROM table WHERE account_id = 123456) 
    AND account_id = 123456 
+0

否。至少,您需要使用'WHERE account_id = 123456'來限定子選擇。請參閱artemb的答案是否這樣做。 –

+0

D'oh ..絕對。我修復了我的回答 – adamJLev

1

嘗試這樣:

select txn_id, account_id 
order by txn_id desc 
limit 1,18446744073709551615; 
+0

+1。如果您沒有訂單偏好,最好選擇。如果你這樣做,得去選擇 – artemb

+0

你能解釋這是如何工作的 - 因爲我不明白它爲什麼可以工作。 –

+0

它按照相反的順序對txn_id上的記錄進行排序,這意味着最高的txn_id將排在最前面。然後它返回從第二個開始的所有記錄,有效地跳過最高記錄txn_id – artemb

0
select txn_id from table 
where account_id = 123 and 
txn_id < (select max(txn_id) from table where account_id = 123) 
+0

這對一個帳戶一次很好。我認爲問題在於爲每個account_id值執行相應的聲明。 –

2

鑑於要求:

我想要做一個查詢將獲得所有交易不是最近的交易的所有txn_id (最高txn_id)爲account_id。

似乎一次給你一個帳戶的交易ID的答案缺少查詢點。

要獲得必須保留(或忽略)事務ID的列表中,我們可以這樣寫:

SELECT MAX(txn_id) AS max_txn_id, account_id 
    FROM UnnamedTable 
GROUP BY account_id; 

現在,我們需要得到該列表中未找到事務ID列表。事實並非完全直接:

SELECT txn_id, account_id 
    FROM UnnamedTable 
WHERE txn_id NOT IN 
      (SELECT max_txn_id 
       FROM (SELECT MAX(txn_id) AS max_txn_id, account_id 
         FROM UnnamedTable 
         GROUP BY account_id 
        ) 
      ) 

無論如何,這工程確定與IBM Informix Dynamic Server的11.50和下面的表和數據:

create table unnamedtable(txn_id integer not null, account_id integer not null); 
insert into unnamedtable values(1, 12); 
insert into unnamedtable values(2, 12); 
insert into unnamedtable values(3, 12); 
insert into unnamedtable values(4, 13); 

產生的結果:

1 12 
2 12