Группа 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'))
)
структура базы данных
Ну, я использую 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)
проблема в том, что я получаю дубликаты обоих курсов и имен, поэтому, если курс имеет двух пользователей, он будет печатать студентов и курс два раза. Вот как это выглядит:
неправильный взгляд
и вот как это должно выглядеть:
правильная точка зрения
проблема
проблема приходит, когда я добавляю второй многие-ко-многим таблица, например 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()
в нужный столбец вы хотите быть уникальным