2

こんにちは私はmysqlselectステートメントに問題があります私は頭を動かすことができません、

テーブルclient_directory_data

id int、verified int、client_id int、作成されたタイムスタンプ、説明longtext

select * from client_directory_data where verifyed = 1 order by created desc

ただし、これにより、client_idごとに複数の行が選択されます

私がする必要があるのは、verified = 1を持つすべてのclient_idを選択することですが、各client_idの最新の行のみを取得します。それが理にかなっていることを願っています。

4

3 に答える 3

4

これは私がいつも直面している問題です。幸いなことに、これを行うためのちょっとしたコツがあります。

SELECT
client_id,
SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY created DESC),",",1) AS `id`
FROM client_directory_data
WHERE verified = 1
GROUP BY client_id

また、行全体が必要な場合は、次のように参加できます。

SELECT
*
FROM (
  SELECT
  client_id,
  SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY created DESC),",",1) AS `id`
  FROM client_directory_data
  WHERE verified = 1
  GROUP BY client_id
) ids
JOIN client_directory_data USING (id);

もちろん、とにかくインデックス付きフィールドで注文する場合(したがって、とにかく効率的に結合できる)、MAX(id) AS id実際にはパフォーマンスにほとんど影響を与えませんが、を使用することをお勧めします。MAX()を使用する主な理由は、実際にはコードを少し単純にするためです。また、フィールドにコンマが含まれている場合(グループの連結用に別の区切り文字を使用して回避できる)、またはGROUP_CONCATの最大長に達した場合(拡張可能でSET group_concat_max_len = xxx;、とにかく警告のみが発生する)に発生する可能性のある落とし穴を回避します。

これがパフォーマンスの問題を抱えているように直感的に見える理由はわかりますが、実際には、特に大きなテーブルで、これらのクエリに対して私が見つけた最高のパフォーマンスの方法です。

これは、このスレッドの3つの方法を比較して、現在利用可能ないくつかの大きなテーブルから取得したベンチマークです。

クエリA:(〜5,000レコード、〜900結果、インデックスなしフィールド)

  • GROUP_CONCATメソッド:0.0100秒
  • MAXメソッド:0.102秒
  • LEFT JOIN方式:0.0082秒

クエリB:(〜300,000レコード、〜95,000結果)

  • GROUP_CONCATメソッド:1.8618秒
  • MAXメソッド:1.7904秒
  • LEFT JOINメソッド:6.4649秒

クエリC:(〜300,000レコード、〜7結果)

  • GROUP_CONCATメソッド:0.103秒
  • MAXメソッド:0.0102秒
  • LEFTJOINメソッド:(4時間後に退屈しました)

クエリD:(〜500,000レコード、グループ化されるフィールドの〜5,000の異なる値)

  • GROUP方式:0.1355秒
  • MAXメソッド:0.0429秒
  • LEFT JOINメソッド:(10分後に退屈しました)
于 2012-07-05T11:11:22.020 に答える
3

それは理にかなっており、古典的な質問です。

それを前提としてthe most recent row is the one with highest id、次を使用できます。

SELECT *
FROM client_directory_data c
LEFT JOIN client_directory_data d ON c.client_id = d.client_id AND d.verified = 1 AND d.id > c.id
WHERE d.id IS NULL
    AND c.verified = 1;

このクエリパターンの説明はここにあります

于 2012-07-05T10:53:42.290 に答える
0

テーブルclient_directory_dataの主キーとしてidを作成します

于 2012-07-05T10:55:27.810 に答える