【问题标题】:Complex join with different data types in laravel 8 query builderlaravel 8 查询生成器中具有不同数据类型的复杂连接
【发布时间】:2022-01-24 12:31:43
【问题描述】:

我有两张表 Infosnationalities 像这样:

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


【解决方案1】:

nationality 字段中使用逗号分隔的值文本列表是个坏主意。有一个整数数组或 - 更好 - 标准化设计。无论如何,这里是一个原生查询解决方案。

select desig, count(*) count  
from
(
  select unnest(string_to_array(nationality, ','))::integer nat_id 
  from infos
) t
join nationalities n on t.nat_id = n.id
group by desig;

DB Fiddle

desig count
German 1
Qatar 1
Algeria 1
Turkey 2

【讨论】:

    猜你喜欢
    • 2014-01-13
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2014-12-06
    • 2015-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多