2010-06-17 59 views
2

我有這樣的表:一個表,需要多個值從不同的行/元組

'profile_values' 
userID | fid  | value 
-------+---------+------- 
1  | 3  | [email protected] 
1  | 45  | 203-234-2345 
3  | 3  | [email protected] 
1  | 45  | 123-456-7890 

和:

'users' 
userID | name  
-------+------- 
1  | joe  
2  | jane  
3  | jake  

我想加入他們的行列,並有一排有兩個值的樣:

'profile_values' 
userID | name | email   | phone 
-------+-------+----------------+-------------- 
1  | joe | [email protected] | 203-234-2345 
2  | jane | [email protected] | 123-456-7890 

我已經解決了,但它感覺笨拙,我想知道是否有更好的方法來做到這一點。這些解決方案更具可讀性或更快(優化),或者只是最佳實踐。

目前的解決方案:選擇多個表,很多條件語句:

SELECT u.userID AS memberid, 
     u.name AS first_name, 
     pv1.value AS fname, 
     pv2.value as lname 
FROM users AS u, 
     profile_values AS pv1, 
     profile_values AS pv2, 
WHERE u.userID = pv1.userID 
    AND pv1.fid = 3 
    AND u.userID = pv2.userID 
    AND pv2.fid = 45; 

感謝您的幫助!

+0

第一個表的最後2行應該在第一列中有2個嗎? – potatopeelings 2010-06-17 03:31:47

+0

我只想組合一個用戶表,該用戶表在一行中有許多屬於該用戶的更多值。但是其他值在一個表中存在多行。所以把它與一行中的值結合成一個表格。當Drupal模塊用戶配置文件添加擴展用戶配置文件值的功能時,它就以這種方式工作。 – JeroenEijkhof 2010-06-17 17:19:21

回答

4

這是一個典型的支點查詢:

SELECT u.userid, 
     u.name, 
     MAX(CASE WHEN pv.fid = 3 THEN pv.value ELSE NULL END) AS email, 
     MAX(CASE WHEN pv.fid = 45 THEN pv.value ELSE NULL END) AS phone, 
    FROM USERS u 
    JOIN PROFILE_VALUES pv ON pv.userid = u.userid 
GROUP BY u.userid, u.name 

之前加入「左」的「加盟」,如果你想看到沒有在PROFILE_VALUES表中的任何條目誰的用戶。

+0

這隻給我一行,當我的用戶表在現實中是442個元組大。也許我做錯了什麼......其實它只是給我的用戶表中的第一行與我的profile_values表中的值配對 – JeroenEijkhof 2010-06-17 17:07:36

+0

@WmasterJ:441其他用戶是否在'PROFILE_VALUES'表中有條目?我願意打賭他們沒有 - 在這種情況下看到我關於使用LEFT JOIN的說明。 – 2010-06-17 17:17:12

+0

@Ponies:謝謝你的回覆。是的,他們確實有條目。在我的其他SQL中,我的問題中包含的其他SQL實際上只有220行,因爲這些是唯一具有我要查找的值的SQL。我看到了LEFT JOIN評論,沒有奏效。我的sql語句有點不同,因爲我在這裏使用了一個例子。但是如果你能在這個SQL中發現任何錯誤:http://piratepad.net/Io1HDPFHJi – JeroenEijkhof 2010-06-17 17:33:26

0

我沒有這樣說,我應該有(@OMG Ponies),但我想在MySQL視圖中使用它。如果視圖是可編輯的,則不允許使用聚合函數和other constraints。因此,我必須使用與我在最初的問題中描述的相同的SQL查詢。

希望這可以幫助某人,爲創建視圖添加標籤。

相關問題