2010-06-17 58 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查询。

希望这可以帮助某人,为创建视图添加标签。

相关问题