如何计算具有垂直值的多列?

时间:2019-03-10 13:40:16

标签: mysql laravel

我是编程新手。我有桌子

check_1,check_2,check_3 ..etc
------------------------------
 1       1       1
 0       0       1
 1       0       1

我想要这个输出:

column_name, count_true
-----------------------
  check_1       2
  check_2       1
  check_3       3

我已经在MySQL中使用union函数尝试过它,但是当我尝试在laravel中应用它时,我遇到了Union的麻烦。是否存在可以产生此类输出的无联合查询?

预先感谢

3 个答案:

答案 0 :(得分:0)

您可以这样做。 db中的一个查询

$records = DB::table('your_table')->get();
$check1Count = $records->where('check_1', 1)->count();
$check2Count = $records->where('check_2', 1)->count();
$check3Count = $records->where('check_3', 1)->count();
......

$records = DB::table('your_table')->get();
$columns = ['check_1', 'check_2', 'check_3', ...];
$data = [];
foreach($columns as $column) {
    $data[] = [
        'column_name' => $column,
        'count_true' => $records->where($column, 1)->count();
    ];
}

您也可以这样做,但是查询很多

$check1Count = DB::table('your_table')
    ->selectRaw('COUNT(check_1) as count')
    ->where('check_1', 1)
    ->first()
    ->count;

$check2Count = DB::table('your_table')
    ->selectRaw('COUNT(check_2) as count')
    ->where('check_2', 1)
    ->first()
    ->count;
.....

答案 1 :(得分:0)

标准化方法可能如下所示:

response_id  checkbox
          1         1
          1         2
          1         3
          2         3
          3         1
          3         3

答案 2 :(得分:0)

您不需要并集,只需查询所有数据并在Laravel上进行处理即可。假设您使用$ data变量雄辩地查询了所有数据,那么您应该这样做:

//preparing a variable to hold all 24 database field value
$total = [];
foreach ($data as $d) {
    //do this for all 24 database field
    if ($d->check_1) {
        $total[1]++;
    }
    if ($d->check_2) {
        $total[2]++;
    }
    ...
}

通过这种方式,您无法检查$ total [index]变量的结果。是的,有一种更好的方法来存储数据,而不是为每个用户保存所有字段。您可以将所有检查的值存储在数据库中,如下所示:

user_id checkbox_id
      1           3
      1           5
      1           9
      1          24
      2          23
      3           2
      3           3

效率更高,因为您无需保存未选中的复选框值(如果他们更有可能不选中大部分复选框)。