php - 即使内部联接不匹配,如何返回某些内容

标签 php mysql laravel eloquent

我有两张 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/

相关文章:

php - 如何在 Laravel 4 中自动加载 Guzzle?

javascript - Laravel - 如何在 Javascript 中使用 Controller 的返回值?

javascript - 使用文本框使用php表单更新MySQL数据库

php - PHP 核心配置中的 hard_timeout 是什么?

php - 在表中沿链向下移动值

php - Chrome 在下载时无法识别 url 编码的文件名

java - Kotlin 。 Java 和 PHP 与 MySQL 的性能

Mysql LOAD DATA INFILE - 输入数据意外截断

mysql - 笛卡尔加入 MySQL 查询

html - 在 Laravel 中使用 .css 文件