Question

In MySQL, I have three tables that look like:

USERS:

USER_ID | USERNAME
1       | Homer Simpson

FIELDS:

FIELD_ID | FIELD_NAME
1        | Phone
2        | Address

FIELD_VALUES:

USER_ID | FIELD_ID | FIELD_VALUE
1       | 1        | 555-1212
1       | 2        | 10 biteme drive

And what I am wanting to do is combine the three tables so that I end up with one row for each user, with field names as column headers and the field values, so I end up with:

USERS_TABLE:

USER_ID  | USER_NAME     | PHONE    | ADDRESS
1        | Homer Simpson | 555-1212 | 10 biteme drive
Was it helpful?

Solution

If field names (phone and address) are fixed, you could use this trick to pivot your data:

SELECT
  users.user_id,
  users.user_name,
  MAX(CASE WHEN field_id=1 THEN field_value END) AS Phone,
  MAX(CASE WHEN field_id=2 THEN field_value END) AS Address
FROM
  users INNER JOIN field_values
  ON users.user_id = field_values.user_id
GROUP BY
  users.user_id,
  users.user_name

but if your values are not fixed, you need to use a dynamic query:

SELECT    
  CONCAT(    
    'SELECT users.user_id,users.username,',    
    GROUP_CONCAT(CONCAT('MAX(CASE WHEN field_id=', field_id, ' THEN field_value END) AS `', field_name, '`')),    
    ' FROM users INNER JOIN field_values ON users.user_id = field_values.user_id',
    ' GROUP BY users.user_id, users.username')    
FROM `fields` INTO @sql;

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

Please see fiddle here.

OTHER TIPS

try the following : - SELECT users.user_id,username, fv1.field_value value1, innertab.field_value value2 FROM USERS LEFT JOIN FIELD_VALUES fv1 ON users.user_id = fv1.user_id INNER JOIN FIELDS f1 ON fv1.FIELD_ID = f1.FIELD_ID AND f1.FIELD_ID = 1 LEFT JOIN (SELECT users.user_id, FIELD_VALUES.field_value FROM USERS LEFT JOIN FIELD_VALUES ON users.user_id = FIELD_VALUES.user_id INNER JOIN FIELDS ON FIELD_VALUES.FIELD_ID = FIELDS.FIELD_ID AND FIELDS.FIELD_ID = 2) AS innertab ON innertab.user_id = users.user_id

sql fiddle

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top