MySQL перечисляет все записи в левой таблице с помощью Join - PullRequest
1 голос
/ 19 октября 2019

У меня есть две таблицы, одна включает данные об автомобиле, а другая включает данные о топливе следующим образом:

tbl_vehicle

+------------+--------+
| vehicle_id | reg_no |
+------------+--------+
|          1 | ABC    |
|          2 | DEF    |
|          3 | GHI    |
|          4 | JKA    |
|          5 | LMN    |
|          6 | OPQ    |
+------------+--------+

tbl_direct_fuel

+---------+------------+----------+------------+
| fuel_id | vehicle_id | fuel_qty |    date    |
+---------+------------+----------+------------+
|     100 |          1 |       10 | 2019-10-01 |
|     101 |          1 |       12 | 2019-10-02 |
|     102 |          2 |       20 | 2019-10-03 |
|     103 |          3 |       15 | 2019-10-03 |
|     104 |          2 |       25 | 2019-10-04 |
+---------+------------+----------+------------+

Я пытался получитьвсе записи левой таблицы с соответствующими записями правой таблицы. Используется следующий запрос.

select("reg_no,sum(fuel_qty) as total")
            ->from('tbl_direct_fuel')
            ->join('tbl_vehicle', 'tbl_direct_fuel.vehicle=tbl_vehicle.vehicle_id', 'left')
            ->group_by ('reg_no')

Приведенный выше код показывает только следующий вывод.

+--------+----------+
| reg_no | total    |
+--------+----------+
| ABC    |       22 |
| DEF    |       45 |
| GHI    |       15 |
+--------+----------+

Но мне нужны все автомобили с не заправленным топливом, как указано ниже.

Желаемый вывод

+--------+----------+
| reg_no | total    |
+--------+----------+
| ABC    |       22 |
| DEF    |       45 |
| GHI    |       15 |
| JKA    |        0 |
| LMN    |        0 |
| OPQ    |        0 |
+--------+----------+

Ответы [ 2 ]

1 голос
/ 19 октября 2019

Вы бы инвертировали таблицы в left join, чтобы в результирующем наборе появлялись автомобили без заправки (как и ваш left join, позволяющий заправлять без транспортных средств, что не похоже на соответствующий вариант использования).

Я бы также рекомендовал добавлять имена столбцов к таблице, из которой они взяты, чтобы избежать двусмысленности.

Наконец, чтобы вернуть 0 (вместо null) для транспортных средств, которыене было заправки, вы можете использовать coalesce().

select("tbl_vehicle.reg_no, coalesce(sum(fuel_qty), 0) fuel_qty")
    ->from('tbl_vehicle')
    ->join('tbl_direct_fuel', 'tbl_direct_fuel.vehicle = tbl_vehicle.vehicle_id', 'left')
    ->group_by ('tbl_vehicle.vehicle_id')
0 голосов
/ 19 октября 2019

Попробуйте:

select t1.reg_no, t2.fuel_total
from tbl_vehicle t1
left join (
    select vehicle_id, sum(fuel_qty) fuel_total
    from tbl_direct_fuel
    group by vehicle_id
) t2 on t1.vehicle_id = t2.vehicle_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...