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的工作原理。