2016-12-01 4 views
1

私はテーブルのレコードを取得し、そのテーブルの関連レコードの数をカウントするクエリを持っています。MySQLサブクエリ - 最新のタイムスタンプ付きレコードを取得し、フィールドを抽出します

私は何をしたいのですが、ここで何が起こっている関連テーブルの最新のレコードのtextフィールドを取得し、クエリ

SELECT DISTINCT 
    inst.id, inst.name, inst.state, inst.farm_status, 
    (SELECT COUNT(inst_note.id) 
     FROM project_institution_note AS inst_note 
     WHERE inst_note.institution_id = inst.id) AS inst_note_count, 
    (SELECT COUNT(c.id) FROM project_catalog AS c 
     WHERE c.institution_id = inst.id 
     AND c.status = 0 
     AND c.catalog_type BETWEEN 0 AND 1) AS ug_count, 
    (SELECT COUNT(c.id) FROM project_catalog AS c 
     WHERE c.institution_id = inst.id 
     AND c.status = 0 
     AND c.catalog_type BETWEEN 1 AND 2) AS grad_count, 
    (SELECT COUNT(c.id) FROM project_catalog AS c 
     WHERE c.institution_id = inst.id 
     AND c.status = 0 
     AND c.catalog_type >= 3) AS alt_count, 
    (SELECT COUNT(c.id) FROM project_catalog_note AS cn 
     INNER JOIN farmtool_catalog AS c 
     ON c.id = cn.catalog_id 
     WHERE c.institution_id = inst.id) AS catalog_note_count, 
    (SELECT inst_note.text FROM project_institution_note AS inst_note -- Issue portion of query 
     LEFT JOIN project_institution AS inst 
     ON inst_note.institution_id = inst.id 
     WHERE inst_note.institution_id = inst.id 
     ORDER BY inst_note.date DESC 
     LIMIT 1) AS latest_note 
FROM project_institution AS inst 
LEFT JOIN project_institution_note AS inst_note 
ON inst.id = inst_note.institution_id 
LEFT JOIN project_catalog AS c 
ON inst.id = c.institution_id 
WHERE LOWER(inst.state) = "me"; 

に含めることは、それはで最後のレコードをピックアップですproject_institution_noteであり、クエリの値としてtextを処理します。このサブクエリでは、どのように私は

  1. 限度関連project_institution.id
  2. からproject_institution_noteの選択は、最新のタイムスタンプレコードを選択することができます。

私は既に#2を達成しましたが、#1の結果セットを制限するのに役立つ必要があります。何か案は?

+0

サンプルデータと予想される出力を示します。 \t [**最小限で完全で検証可能なサンプルを作成する方法**](http://stackoverflow.com/help/mcve)あなたの質問にはあまりにも多くのデータが関連していません。だから問題を特定するためにコードを減らそうとする。 –

答えて

2

最新のレコード、ええ?つまり、最新のdate値を持つproject_institution_noteのレコードはありますか?

project_institution_noteには自動インクリメントのid列があり、そのテーブルだけをINSERTして決して更新しない場合、これは簡単です。以下はそれぞれinstitution_idの最新のtext値を取得するサブクエリです。

基本的には、最新の textをルックアップするために各機関に対する最大 id値のリストを使用しています
    SELECT a.institution_id, a.text 
        FROM project_institution_note a 
        JOIN ( SELECT MAX(id) id 
           FROM project_institution_note 
           GROUP BY institution_id 
         ) b ON a.id = b.id 

date列を使用する必要がある場合は、それはわずかに困難ですが、同じパターンに従います。 (2つのdateの値が同一である場合、あなたはここから二つの結果を得ることができます。)

    SELECT a.institution_id, a.text 
        FROM project_institution_note a 
        JOIN ( SELECT institution_id, 
            MAX(date) date 
           FROM project_institution_note 
           GROUP BY institution_id 
         ) b ON a.date = b.date 
          AND a.institution_id = b.institution_id      

あなたはその後、独立した(無相関)サブクエリとしてこれを使用して、他のものに参加することができます。ここでは一例だLEFT JOIN代わりのJOINを使用して

SELECT inst.id, inst.name, inst.state, inst.farm_status, 
     note.text 
    FROM project_institution inst 
    LEFT JOIN (
       /* the subquery from above */ 
     ) note ON inst.id = note.institution_id 

にはノートが存在しない結果を抑制することから、クエリを防ぐことができます。

クエリには、多くの従属サブクエリがあります。 MySQLはであり、従属サブクエリでは恐ろしいです。それらを独立したサブクエリとしてリファクタリングし、代わりに結合することができます。

0

解決策が見つかりました。

SELECTのフィールド宣言の一部として、project_institutionから来るinst.idを定義します。 SELECTサブクエリの中で、私は `project_institutionからinst.idを得て、エイリアスを再宣言したいとも言います。それぞれ、institutionにサブクエリ内のinst

SELECT inst_note.text FROM project_institution_note AS inst_note 
    LEFT JOIN project_institution AS `inst` 
    ON inst_note.institution_id = `inst.id` 
    WHERE inst_note.institution_id = `inst.id` 

を変更し、institution.id

は、トリックを行いました。

関連する問題