我正在尝试获取没有关系的记录数(一对多),但问题是它在同一个表中,我不知道该怎么做。
| 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但我不知道如何实现(或者我可能错了)。
答案 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
列拆分为firstname
和lastname
列,然后您可以执行以下操作:
$query = DB::table('people')
->whereNull('person_id')
->groupBy('lastname')
->count();