0

私がやろうとしているのは、個人に関するカスタムデータを保持するテーブルをクエリしてフィールドに取得することですが、個々のフィールドをレコードとして取得しています。

私が使用している現在のステートメントは

SELECT s.fname, s.lname, s.email, s.mobile, s.country, cf.name, ca.value FROM
standard AS s
INNER JOIN people AS p ON
(s.pid = p.pid)
INNER JOIN custom_answers AS ca ON
(ca.pid = p.pid)
INNER JOIN custom_fields AS cf ON
(cf.fieldid = ca.fieldid)
WHERE p.acctid = 'xxxxxxxxxx'

これには22,000行の結果セットが与えられますが、私は900行しか探していません。

データ出力の例は次のとおりです。

fname | lname | email | mobile | country | name     | value
tom   | smith | t@t   | 0412   | AU      | state    | Vic
tom   | smith | t@t   | 0412   | AU      | position | Dept Head
tom   | smith | t@t   | 0412   | AU      | guest    | John Smith
mick  | jones | m@j   | 0411   | AU      | postnom  | AOC
mick  | jones | m@j   | 0411   | AU      | state    | NSW
mick  | jones | m@j   | 0411   | AU      | postcode | 2000

一方、出力したいのは

fname | lname | email | mobile | country | state | position  | guest      | postnom | postcode
tom   | smith | t@t   | 0412   | AU      | Vic   | Dept Head | John Smith | null    | null
mick  | jones | m@j   | 0411   | AU      | NSW   | null      | null       | AOC     | 2000

複雑になる場合と引き起こさない場合があるのは、カスタムフィールドの量が各人で同じではないということです。いくつかはほんの一握りまたはカスタムフィールドを持っているかもしれませんが、いくつかは30以上を持っているかもしれません。

4

2 に答える 2

0

すべての非集計によってグループを適用する必要があり、これによりロールアップが作成されます...したがって、「cf.name」値を各要素と比較することに基づいて MAX() を適用すると、 「as」列ごとの値のみを取得します...そのようなレコードが見つからない場合、空白のままになります(空のスペースを残しましたが、NULLを実行できます...

SELECT 
      s.fname, 
      s.lname, 
      s.email, 
      s.mobile, 
      s.country, 
      MAX( if( cf.name = 'state', ca.value, '          ' )) as State, 
      MAX( if( cf.name = 'position', ca.value, '          ' )) as Position, 
      MAX( if( cf.name = 'guest', ca.value, '          ' )) as Guest, 
      MAX( if( cf.name = 'postnom', ca.value, '          ' )) as PostNom, 
      MAX( if( cf.name = 'postcode', ca.value, '          ' )) as PostCode
   FROM
      standard AS s
         INNER JOIN people AS p 
            ON s.pid = p.pid
            INNER JOIN custom_answers AS ca
               ON p.pid = ca.pid 
               INNER JOIN custom_fields AS cf
                  ON ca.fieldid = cf1.fieldid 
   WHERE 
      p.acctid = 'xxxxxxxxxx'
   group by
      s.fname,
      s.lname,
      s.email,
      s.mobile,
      s.country
于 2012-06-27T02:44:18.457 に答える
0

あなたの質問を正しく理解していれば、以下の構造が機能すると思います。これは、users テーブルとは別のテーブルから学校の所属と帯のランクを取得するために使用したものです。

編集済み: これは既知の数の関連付けとベルト ランク用です。不明な数のオプションに対してどのように変更し、外部結合に合わせて調整するかはわかりません。

        SELECT test.tbl_user_accounts.*, t2.org_name as affil_one, t3.org_name as affil_two, t4.rank_name as rank_name
        FROM test.tbl_user_accounts 
        OUTER JOIN (test.tbl_organizations as t2) ON 
        (t2.org_id = test.tbl_user_accounts.affiliation_one)
        OUTER JOIN (test.tbl_organizations as t3) ON 
        (t3.org_id = test.tbl_user_accounts.affiliation_two)
        OUTER JOIN (test.tbl_ranks as t4) ON 
        (t4.id_rank = test.tbl_user_accounts.user_rank);
于 2012-06-27T00:44:14.900 に答える