2016-05-20 6 views
-1

SELECTクエリで疑問がありました。SQL結果をフィールドに分割して列に変換します

私はユーザーのためのメインテーブルを持っていると私は、コンテンツを分割するために、いくつかの複数のテーブルを作成した私のプロジェクトで

、このような何か:

tblUser UID のuname udateofbirth uadress

tblPhoneNumber PID UID p型 pnumber

tblPhoneRelation UID pid

電話テーブルの結果を使用してユーザーテーブルのフィールドを選択する必要がありますが、電話機を別のフィールドに分割する必要があり、電話番号検索で0〜4の結果が返される可能性がありますユーザーごとに

(商用電話やメッセージの4のための自宅の電話のための携帯電話、2に1のようなp型で定義されている、3) 私は何を持っていることはこれに似ており、私の携帯電話の結果を与える

SELECT u.uname AS Name, u.udateofbirth AS 'Date of B.', p.pnumber AS 'Cell phone' FROM tblUser AS u JOIN phonerelation ON u.uid = phonerelation.uid JOIN tblPhoneNumber AS p WHERE p.pid = 1 AND p.pid = phonerelation.pid; 

そして、私の結果

名前| Bの日付|携帯電話

しかし、私はに増加する必要があります:

名前| Bの日付|携帯電話|ホーム電話|商業用電話|メッセージ電話

Sugestions?

+0

あなたはhttp://sqlfiddle.com/にいくつかのテーブル/データを投稿してください。 –

答えて

0

あなたはこのために条件付き集約を使用することができます。

SELECT u.uname AS Name, u.udateofbirth AS 'Date of B.', 
     MAX(CASE WHEN p.ptype = 1 THEN p.pnumber END) AS 'Cell phone', 
     MAX(CASE WHEN p.ptype = 2 THEN p.pnumber END) AS 'Home phone', 
     MAX(CASE WHEN p.ptype = 3 THEN p.pnumber END) AS 'Commercial phone', 
     MAX(CASE WHEN p.ptype = 4 THEN p.pnumber END) AS 'Message phone' 
FROM tblUser AS u 
JOIN phonerelation ON u.uid = phonerelation.uid 
JOIN tblPhoneNumber AS p ON p.pid = phonerelation.pid 
GROUP BY 1, 2 
+0

Ty vm porのヘルプですが、別の場所でこのコードを使用して作成しようとしていますユーザーの電話リストとLazarus(Delphi)のフィールドに分割して、私はそれを少し編集するためにtryiedしましたが、私は結果リストに1つ以上の行を追加しています。私は電話番号だけを選択しているときにカットする必要がある、ユーザーはvar内に格納されているので、ID比較のためのユーザーテーブルの調査は必要ありません。 – douglascast

+0

Alreadがそれを得ました。 – douglascast

0

私は多対多users間とphonesを持っているのは不適切であることを示唆しています。代わりに、単純に1人のユーザーから複数の電話を使用します。その後

PRIMARY KEY(uid, type)

CREATE TABLE Phones (
     uid ..., 
     type ENUM('cell', 'home', ...), 
     pnumber VARCHAR(20) CHARACTER SET ascii, 
    PRIMARY KEY(uid, type, pnumber) 
); 

SELECT u.uname, ... 
     GROUP_CONCAT(CONCAT(p.type, ': ', p.number) SEPARATOR ', ') AS 'Phone(s)' 
    FROM Users u 
    LEFT JOIN Phones p USING(uid) 
    GROUP BY uid 

のようなもの、その代わりに、単一のユーザーのために、単一の細胞数に各ユーザーを制限します。 (これは望ましい機能かもしれません)

関連する問題