1

MySQLには3つのテーブルがあり、ユーザーがどのような資格を持っているかを示すために相互に接続しています。ヘッダーにタイプの完全なリストが表示され、左側の列にユーザー名が表示され、列にタイプヘッダーの下に有効期限が表示されるテーブルを作成したいのですが、次のようになります。

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クエリの結果を取得し、各行を分解してテーブルに入力する予定です。誰かがSQLを完成させて、不足しているType列を表示したり、より良い方法を提案したりするのを手伝ってくれたら、ありがたいです。

私の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
4

1 に答える 1

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で回答を確認してください

于 2012-11-20T23:52:31.090 に答える