2

これには簡単な解決策があると思います。StackOverflowで他の質問を調べましたが、非効率的であるか、間違っている可能性があります。

これが私が扱っているテーブルの簡略化されたバージョンです。

CREATE TABLE object_values (
  object_value_id INT PRIMARY KEY,
  object_id INT,
  value FLOAT,
  date_time DATETIME,
  INDEX (object_id)
);

CREATE TABLE object_relations (
  object_group_id INT,
  object_id INT,
  INDEX (object_group_id, object_id)
);

多対1の関係があります-1つのオブジェクトあたりの多くのオブジェクト値(オブジェクトあたり平均150のオブジェクト値)

object_group_idに基づいて、各object_idの最後のオブジェクト値(date_timeフィールドで決定)を取得したいと思います。

現在のクエリ:

SELECT a.`object_id`, a.`value` 
FROM `object_values` AS a 
    LEFT JOIN `object_relations` AS b 
        ON ( a.`object_id` = b.`object_id` ) 
WHERE b.`object_group_id` = 105 
ORDER BY a.`date_time` DESC

これにより、すべてのレコードがプルバックされます-GROUPBYを実行した場合。object_idその後、ORDERBYは無視されます

私は一連のバリエーションを試しましたが、これはよくある質問であることを知っているのでお詫びしますが、他の解決策を試すことは今のところうまくいきません。どんな助けでも大歓迎です。

一部のソリューションは、約70秒後に結果を返しました。これは大規模なシステムであるため、少し高速にする必要があります。

4

2 に答える 2

2
SELECT a.object_id, a.`value`
FROM object_values a JOIN object_relations b
    ON a.object_id = b.object_id
    JOIN (
    SELECT a.object_id, MAX(a.date_time) MaxTime
    FROM object_relations b JOIN object_values a
        ON a.object_id = b.object_id
    WHERE b.`object_group_id` = 105 
    GROUP BY a.object_id
  ) g ON a.object_id = g.object_id AND a.date_time = g.MaxTime
WHERE b.`object_group_id` = 105 
GROUP BY a.object_id

単一のグループGROUP BYに重複がない場合は、ファイナルを省略できます。date_time

于 2011-02-24T20:19:13.553 に答える
1

サブクエリを使用して各オブジェクトの最大日付を取得し、groupbyを使用せずにこのバージョンを試してください。

SELECT a.`object_id`, a.`value` 
FROM `object_relations` b 
JOIN `object_values` a 
 ON b.`object_id` = a.`object_id`
 AND b.`object_group_id` = 105
WHERE a.`date_time` = (select MAX(date_time) from object_values where object_id = a.object_id)

where句でグループIDを指定したため、左側の結合は不要でした。そのため、グループを結合のメインテーブルにしました。これはいくつかの方法で行うことができます。WHEREがANDに変更されただけの場合は、サブクエリをjoin句に移動することもできます。

于 2011-02-24T20:07:39.737 に答える