MYSQL 多个 select 查询在一个重复结果中
MYSQL multiple select queries in one repeating results
我有一个包含一些子查询的查询。子查询本身工作正常,但当放在一个大查询中时,返回的结果只是重复。
查询:
SELECT
kpi.kra_id AS kra,
kpi.id AS kpi,
(
SELECT
ROUND(AVG(sp.progress), 2)
FROM `submissions` AS sub
LEFT JOIN `sub_performancemeasures` sp ON sp.sub_id = sub.id
WHERE sub.programme = 'programme'
AND sub.submission_year = '2015/2016'
AND sub.state = '2'
AND sub.period = '1'
AND pm.kpi_id = kpi.id
) AS p1_programme_score,
(
SELECT
ROUND(AVG(sp.progress), 2)
FROM `submissions` AS sub
LEFT JOIN `sub_performancemeasures` sp ON sp.sub_id = sub.id
WHERE sub.programme = 'programme'
AND sub.submission_year = '2015/2016'
AND sub.state = '2'
AND sub.period = '2'
AND pm.kpi_id = kpi.id
) AS p2_programme_score
FROM `kpis` kpi
LEFT JOIN `performance_measures` pm ON kpi.id = pm.kpi_id
GROUP BY kpi.id
结果如下所示:
我正在寻找的是每个 KPI 以显示每个 p1 和 p2 列自己的分数。
好的,非常感谢 Jerodev and xQBert 为我指明了正确的方向。新的工作查询如下:
SELECT
kpi.kra_id AS kra,
kpi.id AS kpi,
(
SELECT
ROUND(AVG(sp.progress), 2)
FROM `submissions` AS sub
LEFT JOIN `sub_performancemeasures` sp ON sp.sub_id = sub.id
LEFT JOIN `performance_measures` pm ON pm.id = sp.pm_id
WHERE sub.programme = 'programme'
AND sub.submission_year = '2015/2016'
AND sub.state = '2'
AND sub.period = '1'
AND pm.kpi_id = kpi.id
) AS p1_programme_score,
(
SELECT
ROUND(AVG(sp.progress), 2)
FROM `submissions` AS sub
LEFT JOIN `sub_performancemeasures` sp ON sp.sub_id = sub.id
LEFT JOIN `performance_measures` pm ON pm.id = sp.pm_id
WHERE sub.programme = 'programme'
AND sub.submission_year = '2015/2016'
AND sub.state = '2'
AND sub.period = '2'
AND pm.kpi_id = kpi.id
) AS p2_programme_score
FROM `kpis` kpi
GROUP BY kpi.id
此查询的不同之处在于 performance_measures table 的连接位置。它在主查询上,但需要绑定到子查询,所以我移动了它和 VIOLA!
我不知道如何解决这个问题,因为你没有包含数据结构。但是,我可以确定可能的原因。
每个子查询都有这个条件:
AND pm.kpi_id = kpi.id
pm
和 kpi
都不在子查询中,所以这只是在外部查询中重复了 join
条件。据推测,您希望 kpi_id
匹配子查询中的某些 table,sub
或 sp
.
我有一个包含一些子查询的查询。子查询本身工作正常,但当放在一个大查询中时,返回的结果只是重复。
查询:
SELECT
kpi.kra_id AS kra,
kpi.id AS kpi,
(
SELECT
ROUND(AVG(sp.progress), 2)
FROM `submissions` AS sub
LEFT JOIN `sub_performancemeasures` sp ON sp.sub_id = sub.id
WHERE sub.programme = 'programme'
AND sub.submission_year = '2015/2016'
AND sub.state = '2'
AND sub.period = '1'
AND pm.kpi_id = kpi.id
) AS p1_programme_score,
(
SELECT
ROUND(AVG(sp.progress), 2)
FROM `submissions` AS sub
LEFT JOIN `sub_performancemeasures` sp ON sp.sub_id = sub.id
WHERE sub.programme = 'programme'
AND sub.submission_year = '2015/2016'
AND sub.state = '2'
AND sub.period = '2'
AND pm.kpi_id = kpi.id
) AS p2_programme_score
FROM `kpis` kpi
LEFT JOIN `performance_measures` pm ON kpi.id = pm.kpi_id
GROUP BY kpi.id
结果如下所示:
我正在寻找的是每个 KPI 以显示每个 p1 和 p2 列自己的分数。
好的,非常感谢 Jerodev and xQBert 为我指明了正确的方向。新的工作查询如下:
SELECT
kpi.kra_id AS kra,
kpi.id AS kpi,
(
SELECT
ROUND(AVG(sp.progress), 2)
FROM `submissions` AS sub
LEFT JOIN `sub_performancemeasures` sp ON sp.sub_id = sub.id
LEFT JOIN `performance_measures` pm ON pm.id = sp.pm_id
WHERE sub.programme = 'programme'
AND sub.submission_year = '2015/2016'
AND sub.state = '2'
AND sub.period = '1'
AND pm.kpi_id = kpi.id
) AS p1_programme_score,
(
SELECT
ROUND(AVG(sp.progress), 2)
FROM `submissions` AS sub
LEFT JOIN `sub_performancemeasures` sp ON sp.sub_id = sub.id
LEFT JOIN `performance_measures` pm ON pm.id = sp.pm_id
WHERE sub.programme = 'programme'
AND sub.submission_year = '2015/2016'
AND sub.state = '2'
AND sub.period = '2'
AND pm.kpi_id = kpi.id
) AS p2_programme_score
FROM `kpis` kpi
GROUP BY kpi.id
此查询的不同之处在于 performance_measures table 的连接位置。它在主查询上,但需要绑定到子查询,所以我移动了它和 VIOLA!
我不知道如何解决这个问题,因为你没有包含数据结构。但是,我可以确定可能的原因。
每个子查询都有这个条件:
AND pm.kpi_id = kpi.id
pm
和 kpi
都不在子查询中,所以这只是在外部查询中重复了 join
条件。据推测,您希望 kpi_id
匹配子查询中的某些 table,sub
或 sp
.