0

4つの関連するテーブルがあり、次のクエリを使用して、それらを4つLEFT JOINおよび2つのMAX()集計関数と組み合わせます。

SELECT SQL_CALC_FOUND_ROWS
         id,
         cognome,
         nome,
         sesso,
         pr_sedute_complessive,
         presa_in_carico_data,
         cf,
         cnome,
         tdr_cognome,
         tdr_nome,
         COUNT(tbl_trattamenti.trt_id),
         MAX(tbl_trattamenti.data),
         pr_id
FROM     tbl_aziente p1
  LEFT JOIN comuni
         ON comuni.cid = p1.nascita_luogo 
  LEFT JOIN tbl_cartellaclinica
         ON tbl_cartellaclinica.pz_fk_id = p1.id 
  LEFT JOIN tbl_progetto
         ON tbl_progetto.cc_id_fk = tbl_cartellaclinica.cc_id 
  LEFT JOIN tbl_fisioterapista
         ON tbl_fisioterapista.tdr_id = tbl_progetto.pr_fisioterapista_fk 
  LEFT JOIN tbl_trattamenti
         ON tbl_progetto.pr_id = tbl_trattamenti.pr_fk_id 
WHERE    idoneo = 'y'
     AND p1.tipo_assistenza = 4
GROUP BY p1.id
LIMIT 0, 10

これは、1つを除いて、すべて問題ありません。最初のレコードではなくtbl_progetto、最も高いレコードが必要です。idを使用しようとしましたMAX(primaryKey)が、キーのみを取得します。そのpKeyを持つレコードは取得しません。

4

1 に答える 1

0

tbl_progetto 基本的な原則は、 2回参照する必要があるということです。1回目は対象のレコードを識別するサブクエリでid、2回目はそのレコードの残りをフェッチします。

との間に多対1の関係があると仮定するとtbl_cartellaclinicatbl_progettoサブクエリは次のようになります。

SELECT   tbl_cartellaclinica.pz_fk_id, MAX(tbl_progetto.pr_id) AS pr_id
FROM     tbl_cartellaclinica
    JOIN tbl_progetto
      ON tbl_progetto.cc_id_fk = tbl_cartellaclinica.cc_id
GROUP BY tbl_cartellaclinica.pz_fk_id

したがって、変更されたクエリは次のようになります。

SELECT SQL_CALC_FOUND_ROWS
         id,
         cognome,
         nome,
         sesso,
         pr_sedute_complessive,
         presa_in_carico_data,
         cf,
         cnome,
         tdr_cognome,
         tdr_nome,
         COUNT(tbl_trattamenti.trt_id),
         MAX(tbl_trattamenti.data),
         t.pr_id
FROM     tbl_aziente p1
  LEFT JOIN comuni
         ON comuni.cid = p1.nascita_luogo 
  LEFT JOIN tbl_cartellaclinica
         ON tbl_cartellaclinica.pz_fk_id = p1.id
  LEFT JOIN (
    SELECT   tbl_cartellaclinica.pz_fk_id, MAX(tbl_progetto.pr_id) AS pr_id
    FROM     tbl_cartellaclinica
        JOIN tbl_progetto
          ON tbl_progetto.cc_id_fk = tbl_cartellaclinica.cc_id
    GROUP BY tbl_cartellaclinica.pz_fk_id
  ) AS t ON t.pz_fk_id = tbl_cartellaclinica.pz_fk_id
  LEFT JOIN tbl_progetto
         ON tbl_progetto.cc_id_fk = tbl_cartellaclinica.cc_id
        AND tbl_progetto.pr_id = t.pr_id
  LEFT JOIN tbl_fisioterapista
         ON tbl_fisioterapista.tdr_id = tbl_progetto.pr_fisioterapista_fk 
  LEFT JOIN tbl_trattamenti
         ON tbl_progetto.pr_id = tbl_trattamenti.pr_fk_id 
WHERE    idoneo = 'y'
     AND p1.tipo_assistenza = 4
GROUP BY p1.id
LIMIT    0, 10
于 2012-05-14T11:31:25.990 に答える