Mysql 从联接表获取计数

Mysql 从联接表获取计数,mysql,database,Mysql,Database,这是我的问题:我需要获得与满足特定条件的项目相关联的测试用例和问题的数量(成功的测试用例和应用程序的缺陷问题),但由于某种原因,数量并没有增加。我在一个项目中有10个测试用例,其中6个是成功的;和8个问题,其中只有4个是缺陷。然而,每个计数的相应结果显示为24,这毫无意义。不过,我注意到24正好是6乘以4,但我不知道查询如何将它们相乘 无论如何。。。有人能帮我找出我的问题的哪一部分是错的吗?我怎样才能得到正确的结果?提前谢谢 问题是: SELECT p.codigo_proyecto,

这是我的问题:我需要获得与满足特定条件的项目相关联的测试用例和问题的数量(成功的测试用例和应用程序的缺陷问题),但由于某种原因,数量并没有增加。我在一个项目中有10个测试用例,其中6个是成功的;和8个问题,其中只有4个是缺陷。然而,每个计数的相应结果显示为24,这毫无意义。不过,我注意到24正好是6乘以4,但我不知道查询如何将它们相乘

无论如何。。。有人能帮我找出我的问题的哪一部分是错的吗?我怎样才能得到正确的结果?提前谢谢

问题是:

SELECT
    p.codigo_proyecto,
    p.nombre,
    IFNULL(COUNT(iep.id_incidencia_etapa_proyecto), 0) AS cantidad_defectos,
    IFNULL(COUNT(tc.id_test_case), 0) AS test_cases_exitosos,
    CASE IFNULL(COUNT(tc.id_test_case), 0) WHEN 0 THEN 'No aplica'
    ELSE CONCAT((IFNULL(COUNT(tc.id_test_case), 0) / IFNULL(COUNT(tc.id_test_case), 0)) * 100, '%') END AS tasa_defectos
FROM proyecto p
INNER JOIN etapa_proyecto ep ON p.codigo_proyecto = ep.codigo_proyecto
INNER JOIN incidencia_etapa_proyecto iep ON ep.id_etapa_proyecto = iep.id_etapa_proyecto
INNER JOIN incidencia i ON iep.id_incidencia = i.id_incidencia
INNER JOIN test_case tc ON ep.id_etapa_proyecto = tc.id_etapa_proyecto
INNER JOIN etapa_proyecto ep_ultima ON ep_ultima.id_etapa_proyecto =
    (SELECT ep_ultima2.id_etapa_proyecto FROM etapa_proyecto ep_ultima2
    WHERE p.codigo_proyecto = ep_ultima2.codigo_proyecto ORDER BY ep_ultima2.fecha_termino_real DESC LIMIT 1)
WHERE p.esta_cerrado = 1
AND i.es_defecto = 1
AND tc.resultado = 'Exitoso'
AND ep_ultima.fecha_termino_real BETWEEN '2015-01-01' AND '2016-12-31';

我认为很明显,如果没有GROUP BY,您将无法从聚合查询中获得预期的输出(这表明您实际上无法有效地评估此处给出的任何建议)

您还没有提到数据库中数据的状态是如何表示的,所以我不得不根据SQL进行大量猜测,这显然是非常错误的。我不会说西班牙语/葡萄牙语或其他你的母语

如果defects表的主键为null,那么您似乎在推断存在缺陷。主键不能为null。唯一有意义的方法(顺便说一句,它仍然不会给你你想要的答案)是做一个左连接,而不是一个内部连接

但是,即使是简单的计数(),也会考虑在输出集中的空记录(源表中没有记录)为1个记录。

那么你会遇到一个问题,即你的输出中有缺陷和测试用例的产品——考虑没有缺陷的情况,但是2个测试用例(1,2)-外部Juiun的结果将是:

defect   test
------   ----
null     1
null     2
如果只计算行数,输出中将有2个缺陷

以一个更简单的模式,这演示了获取值的两种方法-注意,它们具有非常不同的性能特征

SELECT project.id
, dilv.defects
, (SELECT COUNT(*) 
    FROM test_cases) AS tests
FROM project
LEFT JOIN ( SELECT project_id, COUNT(*) AS defects
    FROM defect_table
    GROUP BY project_id) AS dilv
ON project.id=dilv.project_id

是的,很抱歉我的问题太多了。我急于完成这件事,而且我昨晚睡得不多,所以我今天不是很快。现在我读了你的答案,这似乎是显而易见的。让我告诉你,虽然我不是老手,但我也不是业余爱好者:我知道主键不能为null,事实上,问题是否是缺陷在表“issue”的一列(“is_defect”)中指定。不管怎样,你确实给了我我要求的帮助,尽管我想你本可以更礼貌一些。不过,谢谢你。我有时间的时候会解决我的问题。