質問

と呼ばれる「関連記事」以下の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の正常な選択クエリを実行する必要があるとして、そこにテーブルに多くの更新や挿入になりますが、速くなりますフェッチである

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top