次のようなテーブルを検討してください。
| | txn_id | アカウントID
トランザクションが account_id の最新 (最高の txn_id) ではないすべてのトランザクションのすべての txn_ids を取得する単一のクエリを実行したいと思います。
データベースは MySQL 5.1 であるため、サブセレクトに関するいくつかの制限がある可能性があります。
次のようなテーブルを検討してください。
| | txn_id | アカウントID
トランザクションが account_id の最新 (最高の txn_id) ではないすべてのトランザクションのすべての txn_ids を取得する単一のクエリを実行したいと思います。
データベースは MySQL 5.1 であるため、サブセレクトに関するいくつかの制限がある可能性があります。
私が正しく理解していれば
SELECT txn_id
FROM table
WHERE txn_id <> (SELECT MAX(txn_id) FROM table WHERE account_id = 123456)
AND account_id = 123456
要件を考えると:
トランザクションが account_id の最新 (最高の txn_id) ではないすべてのトランザクションのすべての txn_id を取得する単一のクエリを実行したいと思います。
一度に 1 つのアカウントのトランザクション 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
次のようなことを試してください:
select txn_id, account_id
order by txn_id desc
limit 1,18446744073709551615;
select txn_id from table
where account_id = 123 and
txn_id < (select max(txn_id) from table where account_id = 123)