Mysql 多连接查询,Pivot?麻烦
提前感谢您为我们提供帮助。我知道我以前见过这样做没有太多痛苦,但似乎找不到解决办法 我的数据库看起来像:Mysql 多连接查询,Pivot?麻烦,mysql,sql,pivot,Mysql,Sql,Pivot,提前感谢您为我们提供帮助。我知道我以前见过这样做没有太多痛苦,但似乎找不到解决办法 我的数据库看起来像: `tbl_user: ---------- id ( pkey ) email fName lName tbl_userSparseType: ------------------- id ( pkey ) varName displayName tbl_userSparse: --------------- id ( pkey ) val
`tbl_user:
----------
id ( pkey )
email
fName
lName
tbl_userSparseType:
-------------------
id ( pkey )
varName
displayName
tbl_userSparse:
---------------
id ( pkey )
value ( Value of Sparse Type )
user_id ( => tbl_user.id )
userSparseType_id ( => tbl_userSparseType.id )
使用示例数据:
tbl_user:
(id, email, fName, lName)
1 Bob@example.com Billy Bob
2 Betty@example.com Betty Sue
3 Beam@example.com Jim Beam
tbl_userSparseType:
(id, varName, displayName)
1 fullName Full Name
2 dayPhone Day Phone
3 nightPhone Night Phone
4 cellPhone Cell Phone
5 homeAddr Home Address
tbl_userSparse:
(id, value, user_id, userSparseType_id)
1 Billy John Bob 1 1
2 James B. Beam 3 1
3 123-234-3456 1 2
4 234-345-4567 1 4
5 24 Best st. 2 5
6 456-567-6789 3 3
我尝试进行两次左连接,但这为每个稀疏条目提供了一个tbl_用户行,如:
(id, email, fName, lName, displayName, value)
1,"Bob@example.com","Billy","Bob","Full Name","Billy John Bob"
1,"Bob@example.com","Billy","Bob","Day Phone","123-234-3456"
1,"Bob@example.com","Billy","Bob","Cell Phone","234-345-4567"
尽管进行了大约45分钟的查找,但如果不显式地命名列,我无法找到一种方法来获得类似于以下内容的内容,我需要一种动态方法,只提取应用于被查询的tbl_用户行子集的所有显示名称:
WHERE tbl_user.id IN (1,2)
id | email | fName | lName | Full Name, | Day Phone | Cell Phone |
Home Address
-------------------------------------------------------------------------------------------------------
1 | Bob@example.com | Billy | Bob | Billy John Bob | 123-234-3456 | 234-345-4567 |
2 | Betty@example.com | Betty | Sue | | | | 24 Best St.
再次提前表示感谢,我希望这件事能顺利完成\ 不幸的是,MySQL没有一个基本上就是您要做的
PIVOT
函数。因此,您需要将聚合函数与CASE
语句一起使用。如果知道列数,则可以硬编码值:
select u.id,
u.email,
u.fname,
u.lname,
max(case when t.displayname = 'Full Name' then us.value end) FullName,
max(case when t.displayname = 'Day Phone' then us.value end) DayPhone,
max(case when t.displayname = 'Cell Phone' then us.value end) CellPhone,
max(case when t.displayname = 'Home Address' then us.value end) HOmeAddress
from tbl_user u
left join tbl_userSparse us
on u.id = us.user_id
left join tbl_userSparseType t
on us.userSparseType_id = t.id
where u.id in (1, 2)
group by u.id, u.email, u.fname,u.lname;
看
现在,如果您希望动态执行此操作,这意味着您无法提前知道要转置的列,那么您应该阅读以下文章:
您的代码如下所示:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'max(case when t.displayname = ''',
t.displayname,
''' then us.value end) AS ',
replace(t.displayname, ' ', '')
)
) INTO @sql
FROM tbl_userSparse us
left join tbl_userSparseType t
on us.userSparseType_id = t.id;
SET @sql = CONCAT('SELECT u.id, u.email, u.fname, u.lname, ', @sql, '
from tbl_user u
left join tbl_userSparse us
on u.id = us.user_id
left join tbl_userSparseType t
on us.userSparseType_id = t.id
where u.id in (1, 2)
group by u.id, u.email, u.fname, u.lname');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
请参见您可能需要将功能构建到应用程序中。您想要做的事情有点违背了SQL的工作原理。