mysql을 사용하여 처음 필터링된 결과에 따라 테이블 행 추가
mariadb 버전 10.5.15(및 python 3.9를 사용한 SQLAlchemy)를 사용합니다.count == 3과 같이 다음 테이블을 필터링하면 ID가 있는 행을 얻을 수 있습니다.
2, 3, 4, 7, 12.
다음으로 2, 3, 4, 7 또는 12행의 group_id(null 제외)는 같지만 group_leader 값은 다른 경우 각 행에 대해 (같은 테이블의) 모든 행을 추가합니다.그래서 제가 덧붙이고 싶은 것은
(같은 group_id, 같은 group_leader가 아님) 1, 3 (ID 2) 5 (ID 4에서) 10 (group_leader는 달라야 하므로 ID 7과 ID 10에서만)
아이디 | 세어보세요 | group_id | group_leader |
---|---|---|---|
1 | 7 | 1 | 무효 |
2 | 3 | 1 | 1 |
3 | 2 | 1 | 무효 |
4 | 3 | 2 | 1 |
5 | 6 | 2 | 무효 |
6 | 2 | 3 | 무효 |
7 | 3 | 3 | 무효 |
8 | 1 | 3 | 무효 |
9 | 2 | 3 | 무효 |
10 | 5 | 3 | 1 |
11 | 5 | 무효 | 무효 |
12 | 3 | 무효 | 무효 |
먼저...에서...를 선택할 수 있을까요?여기서...다른 행을 추가합니다.아니면 먼저 조인 같은 걸 해야 하나요?
다음은 실제 예입니다.
def query_positions(position_filter: dict):
result = db.session.query(Positions).join(
ProjectCrafts, Positions.project_craft_id == ProjectCrafts.project_craft_id).join(
Projects, Positions.project_id == Projects.project_id
)
if "firm_id" in position_filter:
result = result.filter(Positions.firm_id == position_filter["firm_id"])
if "craft" in position_filter:
result = result.filter(ProjectCrafts.craft == position_filter["craft"])
if "craft_name" in position_filter:
result = result.filter(ProjectCrafts.craft_name == position_filter["craft_name"])
positions1 = aliased(Positions)
result = result.join(positions1, Positions.is_parent == 1, Positions.family_id == positions1.family_id).join(
Positions.family_id == positions1.family_id)
positions = result.all()
return positions
이 문제는 다음에서 발생합니다.positions1 = aliased(Positions)
그리고 나는 이 오류를 받는다.
...
sa_exc를 올립니다.InvalidRequestError( sqlalchemy.exc).InvalidRequestError:<Aliased>에 가입하는 방법을 알 수 없습니다.0x7fabd1ad30의 Insp; Positions (Positions)>.select_from() 메서드를 사용하여 명시적 좌측을 확립하고 명시적 ON 절이 없는 경우 명시적 ON 절을 제공하여 애매성을 해결하십시오.
count_ 위의 필터링된 테이블을 원래 테이블과 결합할 수 있습니다.이 경우 다음 두 가지 주요 조건이 적용됩니다.
- "group_id"는 동일합니다.
- group_leader가 다르다
그런 다음 a를 적용합니다.UNION
2개의 결과 세트 사이에 (옵션으로)와 를 붙입니다.ORDER BY
명령어를 사용하여 ID의 값을 정렬합니다.
NULL 값과 NON-NULL 값이 같지도 다르지도 않기 때문에 이들 값을 비교하는 방법은 NULL 값을 다음과 같이 변환하는 것입니다.-1
(이 값은 "group_leader" 값으로 사용할 수 없음)를 사용하여COALESCE
기능.
WITH cte AS (
SELECT * FROM tab WHERE count_ = 3
)
SELECT tab.*
FROM tab
INNER JOIN cte
ON tab.group_id = cte.group_id
AND COALESCE(tab.group_leader, -1) <> COALESCE(cte.group_leader, -1)
UNION
SELECT * FROM cte
ORDER BY id
데모를 확인해 주세요.
언급URL : https://stackoverflow.com/questions/72822303/adding-more-table-rows-depending-on-the-first-filtered-result-with-mysql
'programing' 카테고리의 다른 글
Composer에서 특정 커밋을 올바르게 요구하여 종속 패키지에서 사용할 수 있도록 하려면 어떻게 해야 합니까? (0) | 2022.10.20 |
---|---|
PHP: 재인덱스화 대신 키를 유지하면서 두 어레이를 병합하시겠습니까? (0) | 2022.10.20 |
Python으로 긴 줄 바꿈 (0) | 2022.10.20 |
스크립트를 실행하고 있는 Python 버전을 확인하려면 어떻게 해야 합니까? (0) | 2022.10.20 |
어레이에서 스트림을 작성하려면 어떻게 해야 합니까? (0) | 2022.10.20 |