2

次のようなログテーブルがあります。

logs (_id_, client, metric, value);

ログテーブルから情報を取得するために、PHP フロントエンドから MySQL に次のクエリを書き込もうとしています。

SELECT client, LAST(value) AS value
FROM logs 
WHERE metric = 'free space'
GROUP BY client;

もちろん、それLASTは有効な集計関数ではありません。

私の提案する解決策はこれです:

SELECT client, value 
FROM logs 
WHERE id IN (
   SELECT MAX(id) 
   FROM logs 
   WHERE metric = 'free space' 
   GROUP BY client);

ただし、4,000 行の非常に小さなテーブルの場合、このクエリを開発マシンで実行するには 60 秒以上かかります。

提案?

4

2 に答える 2

3

結合でこれを行う必要があります

SELECT l.client, l.value 
  FROM logs l
  JOIN ( SELECT client, MAX(id) as id
           FROM logs 
          WHERE metric = 'free space' 
          GROUP BY client ) s
    ON l.id = s.id

また、外側のクエリに対して(可能であれば一意の) インデックスをid設定する必要があります。これにより、結合でインデックスを使用できるようになります。最適化が非常に重要な場合は、副選択のためにclient, id、または場合によっては のインデックスも必要になる場合がありid, clientますが、とにかくテーブル全体をスキャンする必要があるため、これはそれほど重要ではありません。

SQL JOIN と IN のパフォーマンスも参照してください。またはの使用に関する議論のための大きな行セットでの INとJOINinjoin

于 2012-04-22T12:25:41.477 に答える
1

このクエリは、group by 操作の実行後に最新の行を提供します。別のテーブルの結合も示されています。

メッセージを選択します。* , users. idAS user_id, users. first_nameuserslast_name FROM メッセージ LEFT JOIN usersON users. id= messages. sender_id WHERE messages.id IN ( SELECT MAX(messages.id) FROM メッセージ WHERE messages.receiver_id = 2 GROUP BY messages.sender_id);

于 2012-11-15T06:06:14.403 に答える