1

更新 これはsqlfiddle http://sqlfiddle.com/#!2/e0822/1/0です

アプリの MySQL データベース (itunes_id) があり、各アプリ ID にはコメント フィールドがあります。履歴を保持するために、コメントが変更されるたびに新しいデータ行が追加されます。以下のクエリでは、すべてのアプリ (itunes_id) の最新のエントリ (最大 ID) のリストが必要です。

これが私のデータベースのヘッダーです:

id  (key and auto increment)
itunes_id
comments 
date

このクエリは、特定の itunes_id の最新のエントリを取得しています。このクエリをより効率的にするにはどうすればよいですか?

SELECT * FROM (
    SELECT * FROM (
        SELECT * FROM Apps
        ORDER BY id DESC
    ) AS apps1
    GROUP BY itunes_id
) AS apps2
LIMIT 0 , 25
4

4 に答える 4

1

同様のアプローチとして、「recent」ブール フィールドを使用して、最新バージョンを含むレコードをマークします。これには、挿入ごとに UPDATE クエリが必要ですが (前の最近のレコードを非アクティブ化)、クイック選択クエリが可能です。または、2 つのテーブルを維持することもできます。1 つは最近のレコード、もう 1 つは各アプリの履歴です。

編集:おそらく、これに似たテーブルを試すことができます:

  • id int null ではありません auto_increment 主キー
  • バージョン int が null ではない
  • main_id int null
  • 最近のブール値が null でない
  • app varchar(32) が null ではない
  • コメント varchar(200) null

列「main_id」を使用して、バージョン 1 のレコードを指すことができます。

于 2013-02-25T16:53:43.753 に答える
1

IDこのクエリは、すべての最大値を個別に取得するサブクエリを使用しますitunes_ID。サブクエリの結果は、次の 2 つの列で一致する場合、元のテーブルに結合されます:itunes_IDID.

SELECT  a.*
FROM    Apps a
        INNER JOIN
        (
            SELECT  itunes_id, MAX(ID) max_id
            FROM    Apps
            GROUP   BY itunes_id
        ) b ON a.itunes_id = b.itunes_id AND
                a.ID = b.max_ID
LIMIT   0, 25

INDEXパフォーマンスを高速化するには、列itunes_IDおよびに複合列を作成しますID。例えば、

ALTER TABLE Apps ADD INDEX (itunes_ID, ID)
于 2013-02-25T16:51:10.357 に答える
0

特定のアプリ (itunes_id) の最新のエントリ (最大 ID) が欲しいだけです

これでできます

SELECT MAX(id), comments FROM Apps WHERE itunes_id = "iid";

また

SELECT id, comments FROM Apps WHERE itunes_id = "iid" ORDER BY id DESC LIMIT 1;

iid最新のコメントが必要な iTunes ID はどこにありますか。

最大限の効率を得るために、 と が複合インデックスでインデックス化されていることを確認idしてください。itunes_id

于 2013-02-25T16:50:33.380 に答える
0
SELECT * FROM (
    SELECT * FROM (
        SELECT * FROM Apps
        ORDER BY id DESC
    ) AS apps1
    GROUP BY itunes_id
) AS apps2
LIMIT 0 , 25

最も古いレコードは選択されません (生成されたキーが常に「最も古い」とは想定できません)。あなたが望むのは次のようなものです:

SELECT * FROM (
    SELECT * FROM (
        SELECT * FROM Apps
        where some_date = (select max(some_date) from Apps limit 1)
        ORDER BY id DESC
    ) AS apps1
    GROUP BY itunes_id
) AS apps2
LIMIT 0 , 25
于 2013-02-25T16:51:05.447 に答える