Mysql 使用 group BY join 和 case 计数

Mysql count with group BY join and case

我有下面的表格,

id, package_name

测试

id, test_name, test_type

test_package_mapping

id, test_id, package_id

现在我想获取特定 package_id 测试类型

的映射测试计数

示例:

我有两种测试类型

1. MCQ
2. Answer Upload

所以我想像下面这样获取映射测试的计数,

mcqtestcount : 30
answeruploadtestcount: 20

在test_package_mapping中有时会错误地重复test_id所以我也想添加分组依据,

到目前为止,我尝试了如下查询,

$packageid = 131;

$sql = "SELECT COUNT(DISTINCT(case when u.test_type ='MCQ' then 1 end)) AS test_count,
                COUNT(DISTINCT(case when u.test_type ='Answer Upload' then 1 end)) AS answeruploadtestcount
                FROM tests AS u
                INNER JOIN (
                     SELECT test_id
                     FROM test_package_maping
                     WHERE test_package_maping.package_id = $packageid
                     GROUP BY test_package_maping.test_id
                ) AS a ON a.test_id = u.test_id where u.test_type = 'Mains'";
$testscount = DB::select($sql);

以上查询无效,当我尝试使用不同的方法通过分组进行计数时,它显示 1,即使它有更多记录。 任何解决方案? 谢谢。

您可以通过在 teststest_package_mapping 的连接 table 中按 test_type 分组来获得所需的结果。

请尝试使用以下SQL。

并且您需要在测试 table 的 test_type 列上添加索引。

SELECT
  t.test_type,
  COUNT (t.id) AS testCount
FROM
  tests AS t
  INNER JOIN test_package_mapping m
    ON t.id = m.test_id
WHERE m.package_id = $ packageid
GROUP BY t.test_type;