【问题标题】:SQLAlchemy group_concat and duplicatesSQLAlchemy group_concat 和重复项
【发布时间】:2014-12-22 09:52:31
【问题描述】:

当我尝试加入 many-to-many 表并按 main-id 分组时,我得到 duplicates添加第二个多对多表。

这是我的模型的样子:

型号

用户

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 来选择包含我想要的数据的所需表。用这个 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)

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

错误的观点

它应该是这样的:

正确的看法

问题

当我添加第二个 many-to-many 表时,问题就来了,例如 users/student-identifier。如果我删除我“加入”它的行,我会得到重复项。无论如何要纠正这个问题吗?或者我应该改用 RAW-SQL(如果是,如何?)

【问题讨论】:

  • 旁注。我相信这是名字而不是名字

标签: python flask sqlalchemy flask-sqlalchemy


【解决方案1】:

找到了解决办法,很简单。

原始 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() 添加到您想要唯一的列中

【讨论】:

  • 您是如何访问模板中的这些分组字段的,仅是 .user_firstName 和 .course_name?
  • 没关系,我添加了一个 .label() 来代替不允许我访问分组字段的原始字段名称。
猜你喜欢
  • 2018-04-21
  • 1970-01-01
  • 2011-06-01
  • 2015-07-14
  • 2011-12-11
  • 2012-07-14
  • 2014-11-25
  • 2021-09-24
  • 2013-11-21
相关资源
最近更新 更多