2016-06-21 39 views
-1

我试图编写一个查询,将查询中的列作为列从其他表中抽出数据。使用SQL连接表作为额外的列

下面是数据:

用户表

ID ACCOUNT_ID FIRST_NAME  LAST_NAME 
1   1    Joe   SMITH 
2   1    Bill   WALTERS 
3   1    Bill   JOHNSON 

用户字段表

ID  ACCOUNT_ID  NAME 
1   1   CITY 
2   1   STATE 
3   2   EMPLOYEE_NUMBER 
4   3   MIDDLE_NAME 

用户字段数据表

ID USER_FIELD_ID  USER_ID  DATA 
1   1    1   LINCOLN 
2   2    1   NEBRASKA 

我想查询像:

SELECT FIRST_NAME, LAST_NAME FROM users WHERE ACCOUNT_ID=1 

,但我想它包括城市和国家为列,但这些将根据ACCOUNT_ID并在用户字段表中的数据是不同的。

我在想这可能是用PIVOT完成的,但我很难让它工作。谢谢!

+0

请出示你已经尝试了什么。请参阅http://stackoverflow.com/questions/7674786/mysql-pivot-table关于如何在MySQL中进行数据透视的示例。 – Barmar

+0

请参阅http://stackoverflow.com/questions/26665499/mysql-create-a-new-table-using-data-and-columns-from-three-tables/26665554#26665554了解如何使用属性 - 值表。 – Barmar

+0

阅读此:http://modern-sql.com/use-case/pivot –

回答

0

使用此代码将起类似于PIVOT的作用。您需要为每个需要的User Field类型添加MAX(CASE)。由于它是用聚合,你只会得到一个User Fields Data值为每个User Field

SELECT u.FIRST_NAME, 
     u.LAST_NAME, 
     uf.CITY, 
     uf.STATE 
FROM users u 
     LEFT JOIN (SELECT uf.ACCOUNT_ID, 
          ufd.USER_ID, 
          MAX(CASE WHEN uf.NAME = 'CITY' THEN [DATA] END) AS CITY, 
          MAX(CASE WHEN uf.NAME = 'STATE' THEN [DATA] END) AS STATE 
        FROM  UserFields uf 
          JOIN UserFieldData ufd ON uf.ID = ufd.USER_FIELD_ID 
        GROUP BY uf.ACCOUNT_ID, 
          ufd.USER_ID 
       ) uf ON uf.USER_ID = u.ID 
          AND uf.ACCOUNT_ID = u.ACCOUNT_ID 
WHERE u.ACCOUNT_ID = 1