0

ここで質問があります...私はこのような3つのテーブルを持っています...

お客様

idCustomer | namaCustomer | email   | noTelp 
__________________________________________________
1          |  Wawan       | a@a.com | 08985623895

属性

idAttribute | Name   | publish
______________________________
1           | Gender |  Y
2           | Hobby  |  Y
3           | Job    |  Y
4           | Mission|  N

顧客属性

idCustomer  |  idAttribute   | value 
_____________________________________
1           |   1            | Male
1           |   2            | Hacking
1           |   3            | IT Support

問題は..その3つのテーブルからクエリを取得して、このような結果を取得したい場合、どのクエリステートメントですか

idCustomer | namaCustomer | email   | noTelp      | Gender  | Hobby   | Job
___________________________________________________________________________________
1          |  Wawan       | a@a.com | 08985623895 | Male    | Hacking | IT Support

そのため、テーブル列は顧客属性データから追加されましたが、その前に、属性が公開されているかどうかを示す属性テーブルを調べる必要があります (公開値を探します)。

誰でもここで私を助けることができますか?

前に本当にありがとう

4

1 に答える 1

3

これを試して:

SELECT
  c.idCustomer,
  c.namaCustomer,
  c.email,
  c.noTelp, 
  MAX(CASE WHEN a.Name = 'Gender' THEN ca.value END) AS 'Gender',
  MAX(CASE WHEN a.Name = 'Hobby'  THEN ca.value END) AS 'Hobby',
  MAX(CASE WHEN a.Name = 'Job'    THEN ca.value END) AS 'Job'
FROM Customerattribute ca
INNER JOIN attribute a ON ca.idAttribute = a.idAttribute
INNER JOIN Customer c ON c.idCustomer = ca.idCustomer
GROUP BY ca.idCustomer

SQL フィドルのデモ

ただし、新しい属性に対してこのクエリを将来使用するには、次のように動的に実行する必要があります。

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(a.Name = ''',
      a.Name, ''', ca.value, NULL)) AS ',
      a.Name )
  ) INTO @sql
FROM Customerattribute ca
INNER JOIN attribute a ON ca.idAttribute = a.idAttribute
INNER JOIN Customer c ON c.idCustomer = ca.idCustomer
WHERE a.publish = 'Y';

SET @sql = CONCAT('SELECT  c.idCustomer,  c.namaCustomer, '
  ' c.email, c.noTelp, ', @sql, ' FROM Customerattribute ca',
 ' INNER JOIN attribute a ON ca.idAttribute = a.idAttribute', 
' INNER JOIN Customer c ON c.idCustomer = ca.idCustomer',
' GROUP BY c.idCustomer');

SELECT @sql;

prepare stmt 
FROM @sql;

execute stmt;

動的フィドルのデモ

于 2012-11-03T03:49:24.877 に答える