1

クエリログが遅いことは承知していますが、これは最大実行時間を超えたクエリだけではないでしょうか? 私の質問は少し異なります(と思います)。

以下のクエリを実行していますが、問題があるとは思えません。しかし、私がそれを実行すると、「実行中」の時間が20秒を超えてから、何年もの間「フェッチ中」になります。DBのパフォーマンスの問題のために停止しなければならないところまで。

ここで私が間違っている場所を誰かが説明できますか。コーディング初心者なのでお手柔らかにお願いします。

SELECT 
t1.oid,
(SELECT 
        DATE_FORMAT(t2.date,
                    '%d/%m/%y') AS 'AVF Date'
    FROM
        t2
    WHERE
        t1.oid = t2.fk_oid
            AND t2.type = '-25'
            AND YEAR(t2.date) BETWEEN 2005 AND 2014
    ORDER BY t2.date ASC
    LIMIT 1) AS 'AVF Date',
t2.site 
FROM
t1
left join t2 on t1.oid=t2.fk_oid

更新 - わかりましたので、必要なものは次のとおりです。私たちは患者データベースを持っており、これらの患者はこのデータベースに記録された手順を持っています。私は、患者の oid (t1.oid) を、彼らが持っていた最初の手順 (2005 年から 2014 年の間にあった場合) と、それを持っていた場所 (それぞれ t2.date と t2.site) と共に返そうとしていますが、プロシージャは特定のタイプです (t2.type = '-25')

だから基本的に。2005年から2014年の間にAVFを患ったすべての患者と、AVFの「部位」(この場合は左腕/右腕など)

これで少しわかりやすくなれば幸いです。

前もって感謝します。

マイキー

4

2 に答える 2

1

選択でサブクエリなしで結合のみを使用できると思います。試してみてください:

SELECT t1.oid, DATE_FORMAT(t2.date,'%d/%m/%y'),t2.site
FROM table1 AS t1
LEFT JOIN table2 AS t2
ON t1.oid = t2.fk_oid
WHERE
    t2.type = '-25'
    AND YEAR(t2.date) BETWEEN 2005 AND 2014
ORDER BY t2.date ASC
LIMIT 1;

Ps: コードをテストしていません。

于 2015-06-25T12:40:18.040 に答える
0
SELECT  a.fk_oid AS oid,
        DATE_FORMAT(a.first_date, '%d/%m/%y') AS 'AVF Date',
        GROUP_CONCAT(b.site) AS "site(s)"
    FROM  
      ( SELECT  fk_oid,
                MIN(date) AS first_date
            FROM  site
            WHERE  date >  CURDATE() - INTERVAL 10 YEAR
              AND  date <= CURDATE()
              AND t2.type = -25
            GROUP BY  fk_oid 
      ) AS a
    JOIN  site AS b
    WHERE  b.fk_oid = a.fk_oid
      AND  b.date   = a.first_date ; 
  • first_date内部クエリはfor eachを検索しますoid
  • 外側のクエリは を取得しますが、さらに、特定の oid と日付に対してsite複数ある可能性があると想定しています。sites
  • INDEX(type, date)パフォーマンスに必要です
  • INDEX(fk_oid, date)パフォーマンスに必要です
  • type文字列ではなく数字だと思います。
  • 「過去10年間」を意味するように日付の比較を書き直しました。将来の行がない場合は、 の ID を取得しAND date <= CURDATE()ます。
  • のみが必要なようですのでoid、t1 を取り除きました。t1 からさらにフィールドが必要な場合は、必要なフィールドを追加JOIN t1 WHERE t1.oid = a.fk_oidして参照します。

(他の回答を削除しています。)

于 2015-07-08T16:36:16.797 に答える