1

OK、検索でこれを見逃したかもしれませんが、何を探しているのかわかりません。宛名ラベルを生成するために必要なテーブルがいくつかあります。メインテーブルには名前と名前があります。次に、2番目のテーブルには、phon-123415324、アドレス1-1jamesstなどのデータの複数の行があります...データをバインドするテーブルもあります。結果とクエリの例を次に示します。

SELECT
users.name,
users.surname,
details.`field`,
details.value
FROM
users
Inner Join details ON details.user_id = users.id
Inner Join bookings ON bookings.guest_id = users.id
WHERE
bookings.sub_event_id =  '78'

NAME, SURNAME, field,  value
David   Oden    title   Mr
David   Oden    sex Male
David   Oden    mobile  0534600594
David   Oden    company Fterns Group
David   Oden    position    
David   Oden    address_1   Cnr wtrewr Rd & wert St
David   Oden    address_2   
David   Oden    suburb  wertt Mile wertw
David   Oden    state   MAS
David   Oden    postcode    14113
David   Oden    country USA

必要なものすべてのデータを1行でエクスポートして、宛名ラベルに優れています。これが本当にばかげているならごめんなさい。私は運が悪かったので研究に約4時間を費やしました。

タイプは列ヘッダーで、値はデータである必要があります。

シャウドは読んだ

Title | Name | Surname | Mobile | Company | Address etc.....

MR | David | Oden | 0534600594 | Fterns Group | etc....

どんな助けもいただければ幸いです/

4

1 に答える 1

1

これは関数として知られていPIVOTますが、残念ながら MySQL には がないPIVOTため、集計関数とCASEステートメントを使用して複製する必要があります。クエリに含める必要がある値がわかっている場合は、次のようにハードコーディングできます。

select 
  min(case when d.field = 'title' then d.value end) as Title,
  u.name,
  u.surname,
  min(case when d.field = 'sex' then d.value end) as Sex,
  min(case when d.field = 'mobile' then d.value end) as Mobile,
  min(case when d.field = 'company' then d.value end) as Company,
  min(case when d.field = 'position' then d.value end) as Position,
  min(case when d.field = 'address_1' then d.value end) as Address_1,  
  min(case when d.field = 'address_2' then d.value end) as Address_2,  
  min(case when d.field = 'suburb' then d.value end) as suburb,  
  min(case when d.field = 'state' then d.value end) as State,
  min(case when d.field = 'postcode' then d.value end) as Postcode,
  min(case when d.field = 'country' then d.value end) as country
from users u
left join details d
  on u.id = d.id
left join bookings b
  on u.id = b.guest_id
where b.sub_event_id = 78
group by u.name, u.surname

デモで SQL Fiddle を参照してください

ただし、列の数が不明な場合、または値が変更される場合は、これを動的に実行する必要があります。準備されたステートメントに関する次の記事を読む必要があります。

動的ピボット テーブル (行を列に変換)

コードは次のようになります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'min(case when d.field = ''',
      d.field,
      ''' then d.value end) AS ',
      d.field
    )
  ) INTO @sql
from users u
left join details d
  on u.id = d.d_id;

SET @sql = CONCAT('SELECT u.name,
                    u.surname, ', @sql, ' 
                  from users u
                  left join details d
                    on u.id = d.d_id
                  left join bookings b
                    on u.id = b.guest_id
                  where b.sub_event_id = 78
                  group by u.name, u.surname');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

デモで SQL Fiddle を参照してください

于 2012-09-18T10:23:03.253 に答える