Группа SQLAlchemy concat и дубликаты

когда я пытаюсь присоединиться к многие-ко-многим таблица и сгруппировать его по main-id Я дубликаты когда я добавляю второй многие-ко-многим таблица.

вот как выглядят мои модели например:

модели

пользователей

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_fistName = db.Column(db.String(64))
    ...

student_identifier

student_identifier = db.Table('student_identifier',
    db.Column('class_id', db.Integer, db.ForeignKey('class.class_id')),
    db.Column('id', db.Integer, db.ForeignKey('user.id'))
)

класс

class Class(db.Model):
    sqlite_autoincrement=True
    class_id = db.Column(db.Integer, primary_key=True)
    class_name = db.Column(db.String(128), unique=True)
    mm_children = db.relationship('User', secondary=student_identifier, backref=db.backref('classes'))

class_course_identifier

class_course_identifier = db.Table('class_course_identifier',
    db.Column('course_id', db.Integer, db.ForeignKey('course.course_id')),
    db.Column('class_id', db.Integer, db.ForeignKey('class.class_id'))
)

структура базы данных

mydatabase - er diagram

Ну, я использую SQLAlchemy, чтобы выбрать нужные таблицы с данными, которые я хочу. с этим сессия.запрос

db.session.query(
   Class.class_id,
   Class.class_name,
   func.group_concat(User.user_fistName),
   func.group_concat(Course.course_name)
   ).filter(Class.courses, User.classes).group_by(Class.class_id)

проблема в том, что я получаю дубликаты обоих курсов и имен, поэтому, если курс имеет двух пользователей, он будет печатать студентов и курс два раза. Вот как это выглядит:

неправильный взгляд how it is looking right now

и вот как это должно выглядеть:

правильная точка зрения the right way to look

проблема

проблема приходит, когда я добавляю второй многие-ко-многим таблица, например users/student-identifier. Если я удалю строку, где я "присоединяюсь" к ней, я получаю дубликаты. Есть ли способ исправить это? Или вместо этого я должен использовать RAW-SQL(и если да, то как?)

1 ответов


нашел решение, и это довольно просто.

RAW SQL

SELECT
  class.class_id,
  class.class_name,
  GROUP_CONCAT(DISTINCT course.course_name),
  GROUP_CONCAT(DISTINCT user.user_fistName)  
FROM
  class
JOIN class_course_identifier ON class.class_id = class_course_identifier.class_id
JOIN course ON class_course_identifier.course_id = course.course_id
JOIN student_identifier ON class.class_id = student_identifier.class_id
JOIN user ON student_identifier.id = user.id
GROUP BY class.class_id

SQLAlchemy

db.session.query(
   Class.class_id,
   Class.class_name,
   func.group_concat(User.user_fistName.distinct()),
   func.group_concat(Course.course_name.distinct())
   ).filter(Class.courses, User.classes).group_by(Class.class_id)

просто добавить distinct() в нужный столбец вы хотите быть уникальным