我有两张 table
光标
+-------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| curso | varchar(255) | NO | | NULL | |
+-------+------------------+------+-----+---------+----------------+
特里尼奥斯
+--------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| data_trienio | varchar(255) | NO | | NULL | |
| curso_id | int(11) | NO | | NULL | |
| oe_id | int(11) | NO | | NULL | |
+--------------+------------------+------+-----+---------+----------------+
这些表通过关系连接(通过 curso_id 看到),我想进行一个查询,检索 curso 记录以及与每个表相关的 trienio 记录的数量
所以我在 laravel 中完成了这个查询
$curso = Curso::select([
'cursos.curso',
\DB::raw('count(trienios.curso_id) as count')
])->join('trienios', 'trienios.curso_id', '=', 'cursos.id')
->groupBy('trienios.curso_id');
翻译成这个
select `cursos`.`curso`,
count(trienios.curso_id) as count
from `cursos`
inner join `trienios`
on `trienios`.`curso_id` = `cursos`.`id`
group by `trienios`.`curso_id`
它让我得到了与它们相关的 trienios 的 Cursos 数量。然而,它只提供那些拥有许多与他们相关的 trienios 的人。其他没有与他们相关的trienios的人不会被查询,我想查询他们。那么,我该如何解决这个问题呢?
最佳答案
使用leftJoin()
,选择cursos.id
,并按cursos.id
分组:
$curso = Curso::select([
'cursos.id',
DB::raw('count(trienios.curso_id) as count')
])->leftJoin('trienios', 'trienios.curso_id', '=', 'cursos.id')
->groupBy('cursos.id');
这是我要运行的查询:
SELECT c.id,
COUNT(t.curso_id) AS count
FROM cursos c
LEFT JOIN trienios t
ON t.curso_id = c.id
GROUP BY c.id
LEFT JOIN
应防止 cursos
中的记录被删除,即使它们在 trienios
中没有匹配的对应项。至于您看到的错误,您选择的是 cursos.curso
,它不是聚合,也不会出现在您的 GROUP BY
子句中。当 MySQL 位于 only_full_group_by
中时,这是不允许的,因此我将 select 子句更改为 cursos.id
。
关于php - 即使内部联接不匹配,如何返回某些内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42927588/