Vier Tabellen mit LEFT JOIN ohne Duplikate beitreten
Ich möchte vier Tische mit @ verbindNul Werte und ohne Duplikate und übersetzen Sie es anschließend in eine SQLAlchemy-Abfrage.
Die Tabellen sind (vereinfacht):
Category(id, name)
Task(id, category.id, name)
User(id, name)
Und eine Many-to-Many-Tabelle:
Solved(task.id, user.id)
Ich möchte alle Aufgaben mit ihrer Kategorie und eine Spalte mit einem bestimmten Benutzer erhalten, der die Aufgabe gelöst hat:
+---------------+-----------+-----------+
| category.name | task.name | user.name |
+---------------+-----------+-----------+
| abc | abctask1 | <null> |
| abc | abctask2 | luke |
| def | deftask1 | <null> |
| ghi | ghitask1 | <null> |
| ghi | ghitask2 | luke |
+---------------+-----------+-----------+
Im Moment habe ich 3 bis 4 individuelle SQLAlchemy-Abfragen, um diese Aufgabe auszuführen. Wenn möglich, sollte es nur in einer Abfrage zusammengefasst werden, um zu viele Lesevorgänge in der Datenbank zu vermeiden.
So weit ich habe:
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
Aber trotzdemDISTINCT
, Ich habe Duplikate aus allen Zeilen mit dem angegebenen Benutzer erhalten:
+---------------+-----------+-----------+
| 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
+---------------+-----------+-----------+
Gibt es eine Möglichkeit, diese Tabelle mit einer Abfrage abzurufen und in SQLAlchemy zu übersetzen?