Php 如何在内部联接不匹配的情况下返回某些内容

Php 如何在内部联接不匹配的情况下返回某些内容,php,mysql,laravel,eloquent,Php,Mysql,Laravel,Eloquent,我有两张桌子 库索斯 +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(10) unsigned | NO

我有两张桌子

库索斯

+-------+------------------+------+-----+---------+----------------+
| 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记录的数量

所以我在拉威尔做了这个查询

$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`
它会告诉我有多少个与之相关的curso和trienios。然而,它只给那些有一些与他们相关的三年期的人。其他那些没有与之相关的三年期的人不会被查询,我想查询他们。那么,如何解决这个问题呢?

使用leftJoin,选择cursos.id,并按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

左连接应防止删除游标中的记录,即使这些记录在trienios中没有匹配的副本。至于您看到的错误,您选择的是cursos.curso,它不是聚合,也不出现在GROUPBY子句中。当MySQL只在\u full\u组中时,这是不允许的,因此我将select子句更改为cursos.id.

错误。SQLSTATE[42000]:语法错误或访问冲突:SELECT list的1055表达式1不在GROUP BY子句中,并且包含功能上不依赖GROUP BY子句中的列的非聚合列“repositorio.cursos.curso”;这与sql_mode=only_full_group_by sql不兼容:从select cursos.curso中选择count*作为聚合,从cursos left join trienios中选择count trienios.curso\u id=cursos.id group by trienios.curso\u id count\u row_表格中选择count作为count这是怎么可能的?那么您最初的查询如何运行呢?我最终只禁用了\u full\u group\u by并应用了您的解决方案我只是更改了查询名称行而不是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