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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage