我知道查询日志慢,但这不适用于超过最长执行时间的查询吗?我的问题略有不同(我认为)。
我正在运行以下查询,对我而言似乎不应该出现问题。但是,当我运行它时,“运行”时间超过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)与他们所拥有的FIRST程序(如果是在2005年和2014年之间)以及他们拥有它的地方(分别为t2.date和t2.site)一起返回,但仅限于程序属于特定类型(t2.type =' - 25')
所以基本上。所有在2005年至2014年间都有AVF的患者以及AVF的“部位”(在这种情况下是左臂/右臂等)
我希望这会让它更清晰。
提前致谢。
米奇
答案 0 :(得分:1)
我认为你只能在select中使用没有子查询的连接,试试看:
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:我还没有测试过代码。
答案 1 :(得分: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
找到oid
。site
,但进一步假设给定的oid和日期可能有多个sites
。INDEX(type, date)
INDEX(fk_oid, date)
type
是一个数字,而不是一个字符串。AND date <= CURDATE()
。oid
,所以我摆脱了t1。如果您需要来自t1的更多字段,请添加JOIN t1 WHERE t1.oid = a.fk_oid
并引用所需的字段。(我正在删除我的另一个答案。)