SQLAlchemy group_concat和duplicates

Sig*_*ils 8 python sqlalchemy flask flask-sqlalchemy

当我尝试加入多对多表并通过main-id对其进行分组时,当我添加第二个多对多表时,我得到重复.

以下是我的模型的样子:

楷模

用户

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    user_fistName = db.Column(db.String(64))
    ...
Run Code Online (Sandbox Code Playgroud)

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'))
)
Run Code Online (Sandbox Code Playgroud)

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'))
Run Code Online (Sandbox Code Playgroud)

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'))
)
Run Code Online (Sandbox Code Playgroud)

数据库结构

mydatabase  - 呃图

好吧,我正在使用SQLAlchemy选择我想要的数据所需的表.这个session.query

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)
Run Code Online (Sandbox Code Playgroud)

问题是我得到了课程和名称的重复,所以如果课程有两个用户,它将打印学生和课程两次.这是它的样子:

错误的看法 现在看起来如何

以下是它的外观:

正确的观点 正确的观察方式

问题

当我添加第二个多对多表时,问题就出现了,例如users/student-identifier.如果我删除我"加入"它的行,我得到重复.反正有没有纠正这个?或者我应该使用RAW-SQL(如果是,如何使用?)

Sig*_*ils 15

找到解决方案,这很简单.

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
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

只需添加distinct()到您想要独特的所需列

  • 没关系,我添加了.label()来代替原始字段名称,这不允许我访问分组字段. (2认同)