我正在使用 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/