2013-06-24 167 views
2

我正在嘗試「PHP登錄&用戶管理」插件,該插件允許用戶配置文件中的自定義字段。
然而,由於某種原因,這是在一個單獨的表上實現的,所以爲了拉起「電話號碼」例如,我必須從login_users獲取我的user_id,進入login_profile_fields表,找到正確的行,拉id和標籤,並找到login_profiles中的行,其中id=pfield_iduser_id = user_idPHP/MySQL:如何查詢行數據信息作爲列數據?

我試圖寫一個SQL查詢,顯示最終的以下信息:

名稱|電子郵件|電話號碼|郵政編碼|部門|技能|經理電子郵件|公司代碼|狀態

其中login_profiles選定值爲X (例如:「請列出誰擁有的狀態代碼爲1的所有用戶的上述信息」)

有我的方式做到這一點?

另外,有沒有一種方法,我可以自動填充login_profiles表中的值,來自login_profiles的值,像這樣?

login_profiles

p_id | pfield_id | user_id | profile_value | Phone Number | Zip Code | ... 
1 | 1   | 1  | 18005551212 | {Select profile_value from login_profiles where user_id=user_id and pfield_id=1} | {Select profile_value from login_profiles where user_id=user_id and pfield_id=2} | ... 

這裏是我當前的表:

login_profile_fields

id | section | type  | label  | 
1 | User Info | text_input | Phone Number | 
2 | User Info | text_input | Zip Code  | 
3 | Work Info | text_input | Department | 
4 | Work Info | text_input | Skills  | 
5 | Work Info | text_input | Manager Email | 
6 | Work Info | text_input | Company Code | 
7 | Work Info | checkbox | Status  | 

login_profiles

p_id | pfield_id | user_id | profile_value | 
1 | 1   | 1 | 18005551212 | 
2 | 2   | 1 | 90210 | 
3 | 3   | 1 | Marketing | 
4 | 4   | 1 | Segmentations and surveys | 
5 | 5   | 1 | [email protected] | 
6 | 6   | 1 | COMP1 | 
7 | 7   | 1 | 1 | 
1 | 1   | 2 | 18007771234 | 
2 | 2   | 2 | 90218 | 
3 | 3   | 2 | CEO | 
4 | 4   | 2 | Business strategy | 
5 | 5   | 2 | [email protected] | 
6 | 6   | 2 | COMP1 | 
7 | 7   | 2 | 1 | 

login_users

user_id| name   | email | 
    1 | Michael Bluth | [email protected] | 
    2 | George Bluth | [email protected] | 

我不是一個MYSQL的人通過培訓,但我正在學習所有我可以,所以任何意見非常感謝!

+1

你不想這樣做。做一個正常的查詢,然後在代碼中進行列轉換。在獲取數據時,客戶端只需要一行代碼就可以這樣做了。在查詢中動態地執行一些隱含的sql。 –

+0

@MarcB - 我非常不同意 - 數據透視表是一個非常普遍的需求,並且不需要大量的SQL,正如下面的bluefeet的答案所證明的那樣。 –

+0

是的,如果mysql支持透視查詢,那很好。但它不,所以你去了。 –

回答

2

要加入到想加入的外鍵關係的表,然後你可以使用聚合函數CASE表達式對行轉換爲列:

select u.name, 
    u.email, 
    max(case when f.label = 'Phone Number' then p.profile_value end) PhoneNumber, 
    max(case when f.label = 'Zip Code' then p.profile_value end) ZipCode, 
    max(case when f.label = 'Department' then p.profile_value end) Department, 
    max(case when f.label = 'Skills' then p.profile_value end) Skills, 
    max(case when f.label = 'Manager Email' then p.profile_value end) ManagerEmail, 
    max(case when f.label = 'Company Code' then p.profile_value end) CompanyCode, 
    max(case when f.label = 'Company Code' then p.profile_value end) Status 
from login_profile_fields f 
left join login_profile p 
    on f.id = p.pfield_id 
left join login_users u 
    on p.user_id = u.user_id 
group by u.name, u.email; 

SQL Fiddle with Demo

如果數值未知,則可能需要使用準備好的語句生成要執行的動態SQL:

SET @sql = NULL; 
SELECT 
    GROUP_CONCAT(DISTINCT 
    CONCAT(
     'max(CASE WHEN f.label = ''', 
     label, 
     ''' THEN p.profile_value END) AS `', 
     label, '`' 
    ) 
) INTO @sql 
FROM login_profile_fields; 

SET @sql 
    = CONCAT('SELECT u.name, 
       u.email, ', @sql, ' 
      from login_profile_fields f 
      left join login_profile p 
       on f.id = p.pfield_id 
      left join login_users u 
       on p.user_id = u.user_id 
      group by u.name, u.email'); 

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

SQL Fiddle with Demo