개발 Q&A

제목 계약된 프로그램들 목록과 함께 특정 프로그램명도 같이 출력할려고합니다.
카테고리 DB
글쓴이 정수리 작성시각 2016/11/29 09:20:51
댓글 : 8 추천 : 0 스크랩 : 0 조회수 : 11740   RSS

유지보수 테이블           유지보수프로그램테이블       프로그램테이블

유지보수pk (uj_pk)          유지보수pk  (uj_pk)              프로그램pk(pg_pk) 

기관pk (gg_pk)                프로그램pk  (pg_pk)         프로그램명(pg_name)                          

                                   프로그램금액  (pg_pr) 

1건의 유지보수 계약을 맺을 경우 유지보수 프로그램에 여러개의 프로그램을 계약 맺을수 있습니다. 

특정기관의 계약 현황에서 계약이 맺어진 프로그램들 중 특정 프로그램을 선택하면 (특정기관->계약현황->특정프로그램 선택) 해당 프로그

램이 계약 맺어진 유지보수 계약건이 보여지면 계약건마다 계약되어있는 프로그램들의 이름이 출력이 되고 선택한 특정프로그램 명과 그 프로그램의 금액이 출력되어야합니다. 

현재는 where조건에 기관pk값을 주었을 경우 해당기관의 유지보수계약에 따른 계약맺어진 프로그램들로 출력은 되도록 하였습니다. 

하지만 문제는 위에서 말한듯이 특정기관->계약현황->특정프로그램을 선택하게되면 where 조건에 기관pk값과 프로그램pk값이 들어가게

되는데 그럴경우 출력을 하였을때 해당기관의 유지보수계약에 따른 계약 맺어진 프로그램들의 이름이 출력되지 않고 where 조건에들어간

프로그램pk값의 프로그램 이름만 출력이 됩니다.. 

나름 해결하고자 생각도 해보면서 서브쿼리도 써보고 해보았지만 원하는 출력형태가 나오지 않네요 ㅜㅜ

포럼선배님들 많이 조언부탁드립니다.

 

원하는 출력형태 ex)A라는 기관에 여러건의 유지보수 계약이 있음 A라는 기관을 들어가서 계약이 맺어진 프로그램들 중 1번 프로그램을 클릭하면 1번프로그램이 포홤되어 있는 계약건들이 출력이 되는 이러한 형태가 출력되도록 하고 싶습니다. 

A기관->계약현황->1번프로그램 선택 시 출력형태

계약품목                                                                                           프로그램명          프로그램 금액 

(해당계약에 계약이 맺어진 프로그램명들*1번프로그램이 포함되어있어야함)      (1번프로그램)    (1번프로그램금액) 

​
select gg_pk, pg_name, jds_uj.uj_pk, group_concat(pg_name separator ",") from jds_uj 
left join jds_uj_pg on jds_uj.uj_pk = jds_uj_pg.uj_pk 
left join jds_program on jds_uj_pg.pg_pk = jds_program.pg_pk 
where gg_pk =? group by jds_uj.uj_pk
 
//저 위의 쿼리의 경우 특정기관에 맺어진 유지보수계약에 따른 계약맺어진 프로그램들의 이름이 출력이됩니다.
 다음글 js event.originalEvent.persist...
 이전글 이런 경우는 어떠한 처리로 하는게 나을까요? (2)

댓글

배강민 / 2016/11/29 14:18:41 / 추천 0

말씀하신 구조로 테스트 테이블을 만들어보면서 보다보니

질문에 모순이 있습니다.

특정기관->계약현황->특정프로그램을 선택했다는것은

WHERE 특정기관 && 특정프로그램인거 아닌가요? 즉, 특정기관의 특정프로그램을 검색하겠다는 것인데,

특정프로그램 선택을 무시하고, 선택한 특정기관의 계약된 프로그램 전체를 보여주고 싶으시다는건가요?

그렇다면, 특정프로그램 조건을 빼면 되는게 아닌가요?

"where 조건에 기관pk값과 프로그램pk값이 들어가게 되는데" => "where 조건에 기관pk값과 프로그램pk값이 들어가게" 처럼 프로그램pk 조건이 추가되지 않게 하면 되는게 아닌가요?

질문의 내용으로는 저는 이렇게밖에 이해하지 못하겠습니다.

정수리 / 2016/11/29 14:36:45 / 추천 0

@배강민

답변감사합니다

테이블까지 만들면서 봐주시다니 감사합니다.

말씀하신대로 특정기관->계약현황->특정프로그램선택하면

where 조건에 특정기관  and 특정프로그램이 들어가게됩니다.

이해하신 where 특정기관 && 특정프로그램이 맞습니다.

제 질문이 이해하기 어렵게 되어있나보네요 좀더 글을 수정하여 

제가 원하는 형태무엇인지 알수있도록하겠습니다.

배강민 / 2016/11/29 14:46:40 / 추천 0

그럼

기관 && 1번 프로그램을때

그 기관의 모든 프로그램을 , 구분으로 나열되게 하고, 1번 프로그램만의 이름, 가격만을 한 row로 가져오고 싶다 이거신가보군요.;

쿼리로만으로 될 수 있을지 좀 해보겠습니다만, 가능할지, 가능하더래도, php에서 조작하는게 더 나을지는 봐야겠네요.

일단 해볼께요.

 

정수리 / 2016/11/29 14:57:17 / 추천 0

@배강민

답변감사합니다

신경써주셔서 감사합니다

잘못이해하신 것 같아 다시 말씀드리면

그기관의 계약 현황에 들어가면 그기관에 계약되어 있는 프로그램 목록이 쭉 출력이 되어 있습니다(이것은 다른 쿼리 사용하여 미리출력이 되어있습니다) 프로그램 목록 중 1번프로그램을 클릭하면 1번프로그램이 포함되어 있는 유지보수계약정보가 출력이 되는데

그출력정보에는

유지보수계약에 계약되어 있는 프로그램들의 이름, 1번프로그램, 1번프로그램 금액 

이렇게 출력이 되도록 하고 싶습니다.

제가 현재까지 한것은 

1번프로그램을 클릭했을 때

1번프로그램, 1번프로그램의 금액까지는 출력을 하였으나

1번프로그램이 포함되어 있는 유지보수계약에 1번프로그램과 함께 계약되어 있는 프로그램들의이름들을 출력하지 못했습니다.

배강민 / 2016/11/29 15:19:49 / 추천 0

SELECT 
    (
        SELECT 
            GROUP_CONCAT(PROGRAM_SUB.pg_name ORDER BY PROGRAM_SUB.pg_name ASC SEPARATOR ",")
        FROM 
            jds_uj AS MAINTENANCE_SUB
        LEFT JOIN 
            jds_uj_pg AS MAINTENANCE_PROGRAM_SUB
        ON MAINTENANCE_SUB.uj_pk = MAINTENANCE_PROGRAM_SUB.uj_pk
        LEFT JOIN 
            jds_program AS PROGRAM_SUB 
        ON MAINTENANCE_PROGRAM_SUB.pg_pk = PROGRAM_SUB.pg_pk
        WHERE 
            MAINTENANCE_SUB.gg_pk = 1 
        GROUP BY 
            MAINTENANCE_SUB.uj_pk
    ) AS MAINTENANCE_PROGRAM_LIST
    , PROGRAM.pg_name
    , MAINTENANCE_PROGRAM.pg_pr
FROM
    jds_uj AS MAINTENANCE
LEFT JOIN 
    jds_uj_pg AS MAINTENANCE_PROGRAM
ON MAINTENANCE.uj_pk = MAINTENANCE_PROGRAM.uj_pk
LEFT JOIN 
    jds_program AS PROGRAM
ON MAINTENANCE_PROGRAM.pg_pk = PROGRAM.pg_pk
WHERE
    MAINTENANCE.gg_pk = 1
    AND PROGRAM.pg_pk = 1
  

더 좋은 쿼리가 있을듯도 하지만, 그냥 막 짜본겁니다. 이게 원하시는게 아니시더래도 더는 시간이 없어서 못 도와드리겠네요.

정수리 / 2016/11/29 15:25:58 / 추천 0

@배강민

답변감사합니다

달아주신 답변을 참고하여 쿼리를 실행해보니 

서브쿼리에서 결과값이 1개 이상이라는 에러가 발생해버리네요 ㅜㅜ

아마도 좀더 찾아봐야할것 같네요 

배강민 / 2016/11/29 15:30:16 / 추천 0

SELECT 
    (
        SELECT 
            GROUP_CONCAT(PROGRAM_SUB.pg_name ORDER BY PROGRAM_SUB.pg_name ASC SEPARATOR ",")
        FROM 
            jds_uj AS MAINTENANCE_SUB
        LEFT JOIN 
            jds_uj_pg AS MAINTENANCE_PROGRAM_SUB
        ON MAINTENANCE_SUB.uj_pk = MAINTENANCE_PROGRAM_SUB.uj_pk
        LEFT JOIN 
            jds_program AS PROGRAM_SUB 
        ON MAINTENANCE_PROGRAM_SUB.pg_pk = PROGRAM_SUB.pg_pk
        WHERE 
            MAINTENANCE_SUB.gg_pk = 1 
            AND MAINTENANCE_SUB.uj_pk = MAINTENANCE.uj_pk
    ) AS MAINTENANCE_PROGRAM_LIST
    , PROGRAM.pg_name
    , MAINTENANCE_PROGRAM.pg_pr
FROM
    jds_uj AS MAINTENANCE
LEFT JOIN 
    jds_uj_pg AS MAINTENANCE_PROGRAM
ON MAINTENANCE.uj_pk = MAINTENANCE_PROGRAM.uj_pk
LEFT JOIN 
    jds_program AS PROGRAM
ON MAINTENANCE_PROGRAM.pg_pk = PROGRAM.pg_pk
WHERE
    MAINTENANCE.gg_pk = 1
    AND PROGRAM.pg_pk = 1
  

이렇게 하면 될듯하네요. 메인 쿼리의 uj_pk를 서브쿼리의 조건절로 이용해버리는겁니다.

정수리 / 2016/11/29 16:21:55 / 추천 0

@배강민

답변감사합니다

달아주신 쿼리를 사용하여 출력하니 원하는 형태가 잘 출력이되네요^^

mysql 공부를 많이 해야되겠네요 ㅜㅜ 기초적인것만 사용할줄 알지

심오한것은 사용할줄 몰라서 ㅜㅜ