3

私はこのようなSQLiteテーブルを持っています:

Col1  Col2  Col3
1     ABC   Bill
2     CDE   Fred
3     FGH   Jack
4     CDE   June

最大のCol1値を持つCDEのCol2値を含む行、つまりこの場合は6月を見つけたいと思います。または、別の言い方をすれば、Col1は自動インクリメント列であるため、col2値がCDEである最後に追加された行です。これを実現するためのSQLクエリ文字列とは何ですか?クエリはループ内で多くの反復を実行するため、これを効率的に行う必要があります。

ありがとう。

4

4 に答える 4

1
SELECT * FROM table WHERE col2='CDE' ORDER BY col1 DESC LIMIT 1

col1が増分でない場合は、次のようになります。

SELECT *,MAX(col1) AS max_col1 FROM table WHERE col2='CDE' GROUP BY col2 LIMIT 1
于 2012-11-24T01:01:58.847 に答える
1

これを試して:

SELECT t1.*
FROM table1 t1
INNER JOIN
(
   SELECT MAX(col1) MAXID, col2
   FROM table1
   GROUP BY col2
) t2 ON t1.col1 = t2.maxID AND t1.col2 = t2.col2
WHERE t1.col2 = 'CDE';

SQLフィドルデモ1


1:このデモはmysqlですが、sqliteの同じ構文で正常に動作するはずです。

于 2012-11-24T01:48:04.910 に答える
0

次のようなサブクエリを使用します。

SELECT Col1, Col2, Col3
FROM table
WHERE Col1 = (SELECT MAX(Col1) FROM table WHERE Col2='CDE')

必要に応じてインデックスを追加します。たとえば、Col1のクラスター化インデックスとCol2の別の非クラスター化インデックスを追加して、サブクエリを高速化します。

于 2012-11-24T01:03:06.487 に答える
-1

SQLite 3.7.11以降では、最も単純なクエリは次のようになります。

SELECT *, max(Col1) FROM MyTable WHERE Col2 = 'CDE'

EXPLAIN QUERY PLANで示されているように、にインデックスがある場合、thisクエリとpassingbyのクエリの両方が最も効率的Col2です。


すべての 値の対応する値を確認したい場合は、Col2代わりに次のようなクエリを使用してください。

SELECT *, max(Col1) FROM MyTable GROUP BY Col2
于 2012-11-24T10:03:08.423 に答える