0

INNER JOINテーブルから単一の行を取得しようとしています。クエリは、コード行を追加するまで行を返しますがLIMIT 1、その後は何も返さず、意味がありません。これが私のコードです。

SELECT DISTINCT pd.pid, fv.flow_bmi, fv.flow_date
FROM patient_data pd
INNER JOIN ( ... )
INNER JOIN (
  SELECT pid, flow_bmi, flow_date
  FROM flow_vitals
  ORDER BY flow_date DESC
) fv ON fv.pid = pd.pid

#Results
-------------------------------
 pid  | flow_bmi  | flow_date
-------------------------------
 6073 | 31.90     | 2011-11-06
 6073 | 33.10     | 2011-11-05 <-- I don't want this row returned
 6072 | 32.10     | 2011-08-01

そして今、私が追加するとLIMIT 1

SELECT DISTINCT pd.pid, fv.flow_bmi, fv.flow_date
FROM patient_data pd
INNER JOIN ( ... )
INNER JOIN (
  SELECT pid, flow_bmi, flow_date
  FROM flow_vitals
  ORDER BY flow_date DESC
  LIMIT 1
) fv ON fv.pid = pd.pid

#Expected Outcome
-------------------------------
 pid  | flow_bmi  | flow_date
-------------------------------
 6073 | 31.90     | 2011-11-06
 6072 | 32.10     | 2011-08-01

#Actual Outcome
-------------------------------
 pid  | flow_bmi  | flow_date
-------------------------------
 No rows returned.

なぜこれが壊れるのかわかりません。LIMIT私が本当に欲しいのはINNER JOIN、最新の日付に基づいて 1 行だけを返す です。この同じトピックについてたくさんの質問があるようですが、最終的に使用するMAX()LIMIT、どちらもうまくいきませんでした。

4

1 に答える 1

1

実際には、テーブルの合計 1 行ではなく、group ごとに 1 行が必要です。そこにa を置くと、テーブル全体から一番上の行だけが返されます。flow_vitalsLIMIT 1

あなたが望む行は、その最大のものであると思いflow_dateますpid。試す:

SELECT DISTINCT pd.pid, fv.flow_bmi, flow_date
FROM patient_data pd
INNER JOIN ( ... )
INNER JOIN (
  SELECT pid, flow_bmi, flow_date
  FROM flow_vitals
) fv ON fv.pid = pd.pid
WHERE flow_date = (SELECT MAX(ffvv.flow_date) FROM flow_vitals ffvv WHERE ffvv.pid = fv.pid)

または、結合として:

SELECT DISTINCT pd.pid, fv.flow_bmi, flow_date
FROM patient_data pd
INNER JOIN ( ... )
INNER JOIN (
  SELECT pid, flow_bmi, flow_date
  FROM flow_vitals
) fv ON fv.pid = pd.pid
INNER JOIN (
  SELECT pid, MAX(flow_date) AS maxDate
  FROM flow_vitals
  GROUP BY pid
) fvMax ON fv.pid = fvMax.pid AND fv.flow_date = fvMax.maxDate

ここもDISTINCT本当に必要なのかなと。

于 2012-11-05T18:36:55.350 に答える