這是我的資料庫模型。
class Doctor(db.Model):
__tablename__ = 'doctor'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(120), nullable=False)
class Patient(db.Model):
__tablename__ = 'patient'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(120), nullable=False)
class Assignment(db.Model):
__tablename__ = 'assignment'
doctorid = db.Column(db.Integer, ForeignKey('doctor.id'),
unique=False, nullable=False, index=True, primary_key=True)
patientid = db.Column(db.Integer, ForeignKey('patient.id'),
unique=False, nullable=False, index=True, primary_key=True)
created = db.Column(db.DateTime(timezone=False),
server_default=db.func.now())
我想列出N分配的患者少于 3 個(可能是用戶指定的)的所有醫生。分配assignment使用外鍵記錄在表中。
請注意,某些醫生可能分配了零個患者,他們也應包含在結果中。
我正在考慮諸如子查詢、GROUP BY 或 OUTER JOIN 之類的東西,但我不知道如何將計數N放入其中。
此外,我想進一步patientid = P1從結果中排除分配給某個患者的所有醫生。除了第一個(小于N)條件之外,這是否可以完成?
uj5u.com熱心網友回復:
要計算每個醫生的分配數量,請使用 GROUP BY 并僅選擇組,在本例中為醫生,滿足特定標準使用 HAVING 子句。如果它們在功能上依賴于分組,則可以從組中確定性地選擇非聚合列,如果按主鍵分組就是這種情況。
docs = db.session.query(Doctor).\
outerjoin(Assignment).\
group_by(Doctor.id).\
having(
db.func.count(Assignment.patientid) < n,
db.func.count().filter(Assignment.patientid == p1) == 0).\
all()
如果您的 DBMS 不支持上面使用的聚合 FILTER 子句來消除分配給患者 P1 的醫生,您可以改用 EXISTS 子查詢運算式:
docs = db.session.query(Doctor).\
outerjoin(Assignment).\
filter(db.not_(db.session.query(Assignment).filter(
Assignment.patientid == p1,
Assignment.doctorid == Doctor.id).exists())).\
group_by(Doctor.id).\
having(db.func.count(Assignment.patientid) < n).\
all()
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/400984.html
標籤:Python sql sqlalchemy
下一篇:根據列上的條件獲取記錄的單個值
