запрос строк с условием к другой строке в определенной группе в sqlalchemy

#sqlalchemy #flask-sqlalchemy

#sqlalchemy #flask-sqlalchemy

Вопрос:

У меня есть таблица с тремя столбцами: segment_num , pass_num , is_done . pass_num представляет собой набор (0,1). Для каждого segment_num есть набор всех pass_nums (два раза), что означает, что для каждого есть 4 строки segment_num . is_done может быть true или false.

 segment_num   pass_num   is_done
 1000         0          True
 1000         1                
 1000         0          True   
 1000         1          
     
 1001         0          True
 1001         1              
 1001         0          False
 1001         1          
   
 1002         0          False
 1002         1                
 1002         0          False
 1002         1          
  

Для простоты я не заполнял is_done поля для строк, которые не имеют значения. Я хочу запросить все segment_num s, у которых есть хотя бы один is_done=True для pass_num 0 .

Итак, в этом примере 1000 и 1001 имеют по крайней мере один (pass_num=0 и is_done=True). Таким образом, результат должен быть 1000 и 1001.

Я думаю, что я должен использовать group_by для каждого segment_num и в каждой группе я должен решить, следует ли сохранить segment_num или игнорировать его на основе значения is_done для pass_num= 0 в нем. Я бы предпочел написать это в Sqlalchemy ORM. Любая помощь была бы очень признательна.

Пока у меня есть это:

 db.session.query(Mytable).group_by(Mytable.segment_num).all()
  

Я не уверен, как добавить условие в group_by.

Ответ №1:

Пример SQL в MySQL будет:

 select segment_num from mytable where pass_num=0 and is_done=True group by 
segment_num;
  

Итак, чтобы сделать это в SQLAlchemy

Импорт и_:

 from sqlalchemy import and_
  

А затем получаем результат:

 segments = db.session.query(MyTable.segment_num)
             .filter(and_(MyTable.pass_num == 0,
                          MyTable.is_done == True))
             .group_by(MyTable.segment_num).all()
  

который даст вам значения для одного столбца segment_num, сгруппированные по значениям.