php - 计算模式中多个列中项目的不同出现次数

标签 php mysql

我正在使用 MySql 和 PHP 开发一个调查应用程序 响应将采用以下格式:

+-c1_1-+-c1_2-+-c1_3-+-c1_1-+-c1_2-+-c1_3-+-....
+ red  + blue + pink + cyan + red  + gray + ....
+ black+ pink + plum + red  + blue + gray + ....
+ cyan + red  + blue + blue + pink + plum + ....
+------+------+------+------+------+------+ ....
  • c1_1 代表 Column_For_Question_1_With_Rank_1
  • c1_2 代表 Column_For_Question_1_With_Rank_2
  • c1_3 代表 Column_For_Question_1_With_Rank_3
  • c2_1 代表 Column_For_Question_2_With_Rank_1
  • c2_2 代表 Column_For_Question_2_With_Rank_2
  • c2_3 代表 Column_For_Question_2_With_Rank_3

评分是这样的:

  • 排名 1 = cX_1 列中的颜色 = 获得 3 分(c1_1、c2_1、c3_1..)
  • 排名 2 = cX_2 列中的颜色 = 获得 2 分(c1_2、c2_2、c3_2..)
  • 排名 3 = cX_3 列中的颜色 = 获得 1 分(c1_3、c2_3、c3_3..)

红色分数:

  • 出现在 cX_1 两次 = 3x2=6
  • 出现在 cX_2 两次 = 2x2=4
  • 所以红色的得分为 6+4=10

蓝色分数:

  • 在 cX_1 中出现一次 = 3x1=3
  • 出现在 cX_2 两次 = 2x2=4
  • 在 cX_3 中出现两次 = 1x2=2
  • 所以蓝色的得分为 3+4+2 = 9

是否可以编写一个有效的查询来获得如下结果:

+-color-+-score-+
+  red  +  10   +
+ blue  +   9   +
+  xxx  +   #   +
+  xxx  +   #   +
+  xxx  +   #   +
+-------+-------+

如果那不可能,至少出现的次数如下:

+-color-+-n_cX_1-+-n_cX_2-+-n_cX_3-+
+  red  +   2    +   2    +   0    +
+ blue  +   1    +   2    +   2    +
+  xxx  +   #    +   #    +   #    +
+  xxx  +   #    +   #    +   #    +
+  xxx  +   #    +   #    +   #    +
+  xxx  +   #    +   #    +   #    +
+-------+--------+--------+--------+

实际上颜色会被人名代替。

每组“连续三列”(cX_1、cX_2、cX_3)代表 9 个问题中每个问题的第一、第二和第三等级。所以会有3x9=27列

有人可以帮我解决这个问题吗?我正在考虑反复使用 count(*) 但我确信这是一种错误的方法。发帖前查了很多都没有解决。

编辑 1: 想提一下,这些列中可能有将近 50 个人的名字。每行代表一位调查员的回答。大约有 100 名这样的审查员,因此大约有 100 行。

最佳答案

这是我的解决方案,我比较喜欢用 PHP,所以我的答案是在 PHP 方面,如果你想要 SQL 解决方案,你应该等待一段时间让另一个用户添加 SQL 方面的解决方案,

您将从 MySQL 中获取这种 PHP 数组,

$result = [
    'c1_1'=>['red','black','cyan'],
    'c1_2'=>['blue','pink','red'],
    'c1_3'=>['pink','plum','blue'],
    'c2_1'=>['cyan','red','blue'],
    'c2_2'=>['red','blue','pink'],
    'c2_3'=>['gray','gray','plum']
];

现在,生成一个用户数组,其中包含每个用户在每个类别中的成就,

$users = [];

foreach($result as $k => $v)
{
    foreach($v as $user)
    {
        $users[$user][] = $k;
    }
}

现在,$users 数组看起来像,

array (size=7)
  'red' => 
    array (size=4)
      0 => string 'c1_1' (length=4)
      1 => string 'c1_2' (length=4)
      2 => string 'c2_1' (length=4)
      3 => string 'c2_2' (length=4)
  'black' => 
    array (size=1)
      0 => string 'c1_1' (length=4)
  'cyan' => 
    array (size=2)
      0 => string 'c1_1' (length=4)
      1 => string 'c2_1' (length=4)
  'blue' => 
    array (size=4)
      0 => string 'c1_2' (length=4)
      1 => string 'c1_3' (length=4)
      2 => string 'c2_1' (length=4)
      3 => string 'c2_2' (length=4)
  'pink' => 
    array (size=3)
      0 => string 'c1_2' (length=4)
      1 => string 'c1_3' (length=4)
      2 => string 'c2_2' (length=4)
  'plum' => 
    array (size=2)
      0 => string 'c1_3' (length=4)
      1 => string 'c2_3' (length=4)
  'gray' => 
    array (size=2)
      0 => string 'c2_3' (length=4)
      1 => string 'c2_3' (length=4)

现在,定义一个函数来计算分数,通过我们刚刚生成的用户传递数组,

function marks_of($input)
{
    $marks_index = ['_1'=>3, '_2'=>2, '_3'=>1]; // define marks here
    $marks = 0;
    foreach($input as $marking)
    {
        $marks += $marks_index[substr($marking, -2)];
    }
    return $marks;
}

您需要按照我在上面代码中的注释在每个类别中定义标记。

现在,像这样使用它,

$marks_of_red = marks_of($users['red']);

会给予

int 10

要生成一个数组,其中包含每个用户的名称标记,

$all_users_marks = [];

foreach($users as $name => $achievements)
{
    $all_users_marks[$name] = marks_of($users[$name]);
}

现在,$all_users_marks

array (size=7)
  'red' => int 10
  'black' => int 3
  'cyan' => int 6
  'blue' => int 8
  'pink' => int 5
  'plum' => int 2
  'gray' => int 2

正如我已经说过的,如果你想要 MySQL 方面的答案,请等待某人。

关于php - 计算模式中多个列中项目的不同出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31318845/

相关文章:

mysql - 使用 React-Hook-Form 插入

php - Laravel 从集合中获取 Id

php - Paypal 付款给多个收款人。自适应支付?

SQL 类似问题

PHP fatal error : Allowed memory size of 268435456 bytes exhausted

mysql - 任意字段分组/求和

PHP:如何用 strip_tags($_POST[...]) 批量替换 $_POST[...]

php - 用html向mysql添加新元素

php - 收到错误 : Call to undefined function dio_fcntl() for OBD gateway

php - 我如何优化在嵌套循环中更新排名顺序的 mysql 查询?