2012-11-20 2 views
1

사용자가 가지고있는 자격을 보여주기 위해 서로 연결되는 MySQL에 3 개의 테이블이 있습니다. 나는 헤더 유형의 전체 목록을 표시하는 테이블을 작성하려면, 다음 왼쪽 열에는 이름을 가지고 다음 열과 같이 유형 헤더에서 유효 기간을 표시 :MySQL 크로스 테이블 쿼리 3 테이블, Null 값 표시 그리드

Type 
======== 
Type ID (PK, Int) 
Type (VarChar) 

User 
======== 
User_ID (PK, Int) 
Name (VarChar) 

Qualification 
======== 
Quali_ID (PK, Int) 
User_ID (Int) 
Type_ID (Int) 
DateExpire (Date) 
Status (VarChar) 

내가 출력을 생성 할 같은 :

Users Type1 Type2 Type3 Type4 ....... 
User1 Qual Qual   Qual ....... 
User2   Qual Qual   ....... 
User3     Qual   ....... 
User4 Qual Qual Qual Qual ....... 

은 모든 사용자가 모든 자격을하고 자격 상태가 '전체'와 동일하고 유효 기간이 오늘 날로부터 과거에없는 곳의 대상이 될 것입니다.

나는 아래에있는 인터넷에서 높거나 낮음으로 인터넷 검색을 한 후 SQL을 만들었지 만 존재하지 않는 유형은 포함시키지 못했습니다.

PHP로 MySQL 쿼리의 결과를 가져와 각 행을 분해하여 테이블을 채울 계획입니다. 누군가가 누락 된 Type 컬럼을 보여 주거나 더 나은 방법을 제안하도록 SQL을 완성하도록 도와 줄 수 있다면, 나는 감사 할 것입니다.

내 SQL :

SELECT 'User_ID', 'Name', GROUP_CONCAT(Types.Title ORDER BY QualiList.Type_ID) AS QualType 
FROM TYPES 
INNER JOIN (SELECT DISTINCT Type_ID FROM Qualification) QualiList 
ON (QualiList.Type_ID = Types.Type_ID) 

UNION ALL 

SELECT User.User_ID, User.Name AS Name, GROUP_CONCAT(IFNULL(Qualification.DateExpire,'NA') ORDER BY QualiList.Type_ID) AS QualType 
FROM TYPES 
INNER JOIN (SELECT DISTINCT Type_ID FROM Qualification) QualiList 
ON (QualiList.Type_ID = Types.Type_ID) 
LEFT JOIN Qualification ON (Qualification.Type_ID = QualiList.Type_ID) 
INNER JOIN User ON (User.User_ID = Qualification.User_ID) 
GROUP BY Name 

답변

0

답을 확인이

SELECT USER, 
if(sum(user_id*(1-abs(sign(type_id-1))))>0,DateExpire,'NA') AS TypeADate, 
if(sum(user_id*(1-abs(sign(type_id-1))))>0,Status,'NA') AS TypeAStatus, 
if(sum(user_id*(1-abs(sign(type_id-2))))>0,DateExpire,'NA') AS TypeBDate, 
if(sum(user_id*(1-abs(sign(type_id-2))))>0,Status,'NA') AS TypeBStatus, 
if(sum(user_id*(1-abs(sign(type_id-3))))>0,DateExpire,'NA') AS TypeCDate, 
if(sum(user_id*(1-abs(sign(type_id-3))))>0,Status,'NA') AS TypeCStatus 

FROM (
    SELECT U.USER, T.Type, Q.Type_ID, Q.User_ID,Q.DateExpire,Q.Status FROM Qualification Q 
LEFT OUTER JOIN TYPE T 
    ON Q.Type_id = T.ID 
LEFT OUTER JOIN USER U 
    ON Q.User_id = U.ID 
GROUP BY T.ID, U.ID 
) xxx GROUP BY USER 

http://www.sqlfiddle.com/#!2/c1233/16

에 대한 답을 확인