获取在同一个表中不存在关系(一对多)的计数

时间:2016-10-07 11:36:23

标签: mysql laravel

我正在尝试获取没有关系的记录数(一对多),但问题是它在同一个表中,我不知道该怎么做。

| id | person_id    | name       | 
+----+--------------+------------|        
|  1 | NULL         | John Doe   |
+----+--------------+------------|    
|  2 | NULL         | Jane Doe   |  
+----+--------------+------------+ 
|  3 | 1            | Junior J.D.|  
+----+--------------+------------+
|  4 | 1            | Senior J.D.|  
+----+--------------+------------+

现在由此开始,例如我想得到count = 1,因为Jane Doe没有关系(没有一对多)。

为了更好的解释,我需要(例如)“单身”的人,因为“John Doe”有孩子“Junior J.D.”所以他不算数。

我知道如何计算没有关系的人(使用Laravel Raw)

 $query = DB::table('people')
                 ->select(DB::raw('count(*) as count'))
                 ->where('person_id', '=', NULL)
                 ->get();

现在我想我会使用Exists但我不知道如何实现(或者我可能错了)。

3 个答案:

答案 0 :(得分:2)

您可以使用whereNull方法仅获取具有NULL值的列。

所以,

修改:编辑完成后,我想我理解了这个问题。

此SQL查询应该适合您:

SELECT COUNT(*) as count
FROM people
WHERE person_id IS NULL
    AND id NOT IN (
         SELECT person_id 
         FROM people 
         WHERE person_id IS NOT NULL
    );

如果我们将其翻译成Laravel:

$query = DB::table('people')
             ->whereNull('person_id')
             ->whereIn('id', function($query) {
                 $query->select('person_id')
                       ->from('people')
                       ->whereNotNull('person_id');
             }, 'and', TRUE)
             ->count();

whereInSub的第三个参数是布尔逻辑组合查询。第四个论点意味着我们想要NOT IN

未经测试。所以请测试它,让我知道它是否有效。

这也不是我猜的最好的方法。如果可能,我建议您更改数据库结构。

答案 1 :(得分:1)

这样做

$query = DB::table('people')
        ->whereNull('person_id')
        ->groupBy('name')
        ->count();

答案 2 :(得分:1)

尝试使用whereNull代替where('person_id', '=', NULL)。此外,将name列拆分为firstnamelastname列,然后您可以执行以下操作:

$query = DB::table('people')
    ->whereNull('person_id')
    ->groupBy('lastname')
    ->count();