2016-06-21 33 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