programing

mysql을 사용하여 처음 필터링된 결과에 따라 테이블 행 추가

procenter 2022. 10. 20. 21:47
반응형

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를 적용합니다.UNION2개의 결과 세트 사이에 (옵션으로)와 를 붙입니다.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

반응형