MySQLでのIDの最大値を持つ行を探します
-
19-09-2019 - |
質問
と呼ばれる「関連記事」以下のMySQLのテーブルを見てみましょう。
+----+-----------+---------+------------------------+--------------------------+
| id | articleId | version | title | content |
+----+-----------+---------+------------------------+--------------------------+
| 1 | 1 | 0.0 | ArticleNo.1 title v0.0 | ArticleNo.1 content v0.0 |
| 2 | 1 | 1.0 | ArticleNo.1 title v1.0 | ArticleNo.1 content v1.0 |
| 3 | 1 | 1.5 | ArticleNo.1 title v1.5 | ArticleNo.1 content v1.5 |
| 4 | 1 | 2.0 | ArticleNo.1 title v2.0 | ArticleNo.1 content v2.0 |
| 5 | 2 | 1.0 | ArticleNo.2 title v1.0 | ArticleNo.2 content v1.0 |
| 6 | 2 | 2.0 | ArticleNo.2 title v2.0 | ArticleNo.2 content v2.0 |
+----+-----------+---------+------------------------+--------------------------+
イムArticles.versionが最大数であるArticles.idを返すために、クエリを思い付くしようとしています。
実際の記事のテーブルには、10,000以上のエントリが含まれます。
は、したがって、この例では、私はONLY Articles.id 4と6を返すことにしたいです。 アイブ氏は(キーワードはっきりと機能最大で見て)それを爪ように見えるカントます。
任意の提案が高く評価...
解決
あなたはここにサブクエリを必要とします
SELECT a.id, a.version
FROM articles a
WHERE a.version = (
SELECT MAX(version)
FROM articles b
WHERE b.articleId = a.articleId
)
他のヒント
MySQLのマニュアル、これはトリックを行います:
SELECT a1.id
FROM Articles a1
LEFT JOIN Articles a2 ON a1.articleId = a2.articleId AND a1.version < a2.version
WHERE a2.articleId IS NULL;
リンクマニュアルから:
LEFT JOIN
は<デル>s1.price
デル>a1.version
が<デル>最大デル> 最小の値であるとき、存在することに基づいて動作しますいいえ<デル>s2.price
デル>a2.version
<デル>大きいデル> 低いの値、したがって対応する<デル>s2.article
デル>a2.articleId
の値NULL
です。
(私は彼らのテキストがあなたの状況を一致させるために編集した。)
あなたはここでサブクエリを使用することができます:
select
a.id
from
articles a
where
a.version = (select max(version) from articles)
これが相関サブクエリではないので、あなたはそれを心配する必要はありませんので、それは、かなり速い(早くまたは参加するよりも速く)なります。。しかし、それは最大articleid
を持っているすべての値を返します。
もちろん、私は(articleid
は既にクラスタ化されていると仮定)あなたはid
にインデックスを投げることをお勧めします。それはそれはさらに速く返すのに役立ちます。
コメントで述べたように、各articleid
の最大のバージョンを取得したい場合は、次の操作を行うことができます:
select
a.id
from
articles a
inner join (select articleid, max(version)
from articles group by articleid) as b on
a.articleid = b.articleid
and a.version = b.version
これは、各articleid
の最大を選択相関サブクエリよりもはるかに高速になり、通常そのサブクエリの外に参加して、作成されます。
SELECT Articles.id FROM Articles WHERE Articles.version IN (SELECT MAX(Articles.version) FROM Articles)
多分何かます:
を選択*記事からどこで情報でarticleID(記事から最大(articleversion)を選択します)。
あなたが行うことができます。
SELECT articles.id
FROM articles a
WHERE NOT EXISTS(SELECT * FROM articles a2 WHERE a2.version > a.version)
私はMySQLはそれを実行するかわからないが、OracleやSQLサーバはそれで問題あります。
上記のすべての答えはDJDonaL3000の述べた問題を解決することがあります。しかし、それらのほとんどは、アプリケーションのパフォーマンスを妨げるサブクエリを相関されます。あなたはその後、クラウドアプリケーションを使用している場合は、私は上記のクエリを使用しないようお勧めします。最良の方法は、常にすべてのバージョンの詳細を有する物品及びBの最新バージョンを含む2つのテーブルAとB. Aを維持することです。問題は、あなただけの費用がかかります内側のクエリで最大で、グループをやって、テーブルAの正常な選択クエリを実行する必要があるとして、そこにテーブルに多くの更新や挿入になりますが、速くなりますフェッチである