Я хочу объединить четыре таблицы с значениями и без дубликатов, а затем перевести их в запрос SQLAlchemy.Соедините четыре таблицы с участием LEFT JOIN без дубликатов
Таблицы (упрощенно):
Category(id, name)
Task(id, category.id, name)
User(id, name)
И многие-ко-многим таблице:
Solved(task.id, user.id)
Я хочу, чтобы все задачи с их категории и колонку со конкретным пользователем решившая задача:
+---------------+-----------+-----------+
| category.name | task.name | user.name |
+---------------+-----------+-----------+
| abc | abctask1 | <null> |
| abc | abctask2 | luke |
| def | deftask1 | <null> |
| ghi | ghitask1 | <null> |
| ghi | ghitask2 | luke |
+---------------+-----------+-----------+
на данный момент у меня есть 3 до 4 индивидуальных SQLAlchemy-запросы для выполнения тыс при задании. Если это возможно, его следует объединить только в один запрос, чтобы избежать слишком большого количества чтений в базе данных.
До сих пор я получил:
SELECT DISTINCT
cat.name, t.name, u.name
FROM
Task t
JOIN
Category cat ON cat.id = t.category_id
LEFT JOIN
Solved s ON s.task_id = t.id
LEFT JOIN
User u ON s.user_id = u.id AND
u.name = 'luke'
ORDER BY
cat.name
Но, хотя DISTINCT
, я получил дубликаты из всех строк с заданным пользователем:
+---------------+-----------+-----------+
| category.name | task.name | user.name |
+---------------+-----------+-----------+
| abc | abctask1 | <null> |
| abc | abctask2 | luke |
| abc | abctask2 | <null> | <-- duplicate
| def | deftask1 | <null> |
| ghi | ghitask1 | <null> |
| ghi | ghitask2 | luke |
| ghi | ghitask2 | <null> | <-- duplicate
+---------------+-----------+-----------+
Есть ли возможность получить эту таблицу один запрос и перевести его в SQLAlchemy?
Для записи: DISTINCT будет только сливать строки, которые являются * точно такими же *. Он не удалит «почти дубликаты», как те, которые показаны в OP. – Kevin
В отображаемом результате дубликатов нет. Похоже, вы действительно хотите отличные * задачи * в результате (ровно одну строку за задачу) - с данным пользователем, только если s (он) решил это? BTW, 'User' не является допустимым именем таблицы без двойных кавычек (зарезервированное слово). –