Запрос один ко многим - SQLAlchemy - PullRequest
0 голосов
/ 21 января 2020

Я работаю с 3 таблицей. Driver, Car и Garage. Garage - это таблица отношений 1 to N между Driver и Car (у одного водителя есть хотя бы один автомобиль)

Driver Table
╔════╦══════╗
║ ID ║ Name ║
╠════╬══════╣
║  1 ║ Edson║
║  2 ║ Tomas║
║  3 ║ Carry║
╚════╩══════╩

Car Table
╔════╦════════╗
║ ID ║ Brand  ║
╠════╬════════╣
║  1 ║ Ferrari║
║  2 ║ Porche ║
║  3 ║ McLaren║
╚════╩════════╩
Garage Table
╔════╦═════════╗═══════
║ ID ║Driver.Id║Car.Id║
╠════╬═════════╣═══════
║  1 ║ 1       ║  1   ║
║  2 ║ 2       ║  2   ║
║  3 ║ 2       ║  3   ║
║  4 ║ 3       ║  2   ║
╚════╩═════════╩═══════

Мне нужен список водителей с вашими автомобилями. Примерно так:

[Edson, [Ferrari]]
[Tomas, [Porche, McLaren]]
[Carry, [Porche ]]

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

connection.execute(db.select([Driver.Name, Car.Brand]).where(Garage.Driver.Id == Driver.ID and Garage.Car.Id == Car.ID)).fetchall()

Итак, как мне сделать запрос JOIN, чтобы получить Ожидаемые результаты?

1 Ответ

0 голосов
/ 21 января 2020

Вы можете использовать group_concat, как показано ниже.

ввод данных:

#drop table if exists driver;
create table driver (id int(11), name varchar(255));
insert into driver (id, name) values (1, 'Edson');
insert into driver (id, name) values (2, 'Tomas');
insert into driver (id, name) values (3, 'Carry');

#drop table if exists car;
create table car (id int(11), brand varchar(255));
insert into car (id, brand) values (1, 'Ferrari');
insert into car (id, brand) values (2, 'Porsche');
insert into car (id, brand) values (3, 'McLaren');

#drop table if exists garage;
create table garage (id int(11), driver_id int(11), car_id int(11));
insert into garage (id, driver_id, car_id) values (1, 1, 1);
insert into garage (id, driver_id, car_id) values (2, 2, 2);
insert into garage (id, driver_id, car_id) values (3, 2, 3);
insert into garage (id, driver_id, car_id) values (4, 3, 2);

решение:

select d.name, group_concat(c.brand separator ', ')
from driver d
left join garage g on d.id = g.driver_id
left join car c on g.car_id = c.id
group by d.id;

Вы также можете проверить здесь, где подход рассматривается в больших длинах: Могу ли я объединить несколько MySQL строк в одно поле?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...