【发布时间】:2022-01-24 12:31:43
【问题描述】:
我有两张表 Infos 和 nationalities 像这样:
1) 表格信息:
| id(pk) | name | nationality(varchar) accept multiple nationalities |
|---|---|---|
| 1 | John | 1,2,3 |
| 2 | Camilia | 2,4 |
1) 表国籍:
| id(pk) int | desig |
|---|---|
| 1 | German |
| 2 | Turkey |
| 3 | Algeria |
| 4 | Qatar |
我想得到这样的输出:
| desig | count |
|---|---|
| German | 1 |
| Turkey | 2 |
| Algeria | 1 |
| Qatar | 1 |
为此,我尝试了类似的方法(但没有帮助):
$total_nationalite = DB::table('infos')
->select('desig', 'nationalities.id',DB::raw('COUNT(*) as count'))
->join('nationalities', DB::raw('CAST(nationalities.id as varchar)'), '=', 'infos.nationality')
->groupBy('desig','nationalities.id')
->get();
请使用 查询构建器 或 postgres 中的简单查询提出任何建议。
【问题讨论】:
-
您可以选择代表每个“人”的国籍的字符串,例如"1,2,3" ,然后根据分隔符将其分离出来,然后将其变成一列,最后能够对这些值进行计数。但是我认为最好引入第三个表,它只有 2 列,第一个是来自 infos 的 ID,第二个是来自国籍的 ID ..那么你的计数将是微不足道的。您还可以向该“桥表”添加属性(它允许您处理多对多关系),例如date_nationality_acquired, naturalisation_flag 等
标签: sql laravel postgresql laravel-8 query-builder