将SQL结果拆分为字段并将其转换为列

时间:2016-05-20 18:44:56

标签: mysql mariadb

我对SELECT查询产生了疑问。

在我的项目中,我有一个供用户使用的主表,并且我已经创建了一些表来分割内容,如下所示:

tblUser UID UNAME udateofbirth uadress

tblPhoneNumber PID UID P型 pnumber

tblPhoneRelation UID PID

我需要使用电话表的结果从用户表中选择字段,但问题是我需要将电话分成不同的字段,并且我的电话号码搜索可以为每个用户返回0到4个结果

我所得到的与此类似,并给出了手机的结果(在手机中定义为1,家庭手机为2,商用手机为3,消息为4)< / p>

SELECT u.uname AS Name, u.udateofbirth AS 'Date of B.', p.pnumber AS 'Cell phone' FROM tblUser AS u JOIN phonerelation ON u.uid = phonerelation.uid JOIN tblPhoneNumber AS p WHERE p.pid = 1 AND p.pid = phonerelation.pid;

我的结果

姓名| B的日期|手机

但我需要增加到:

姓名| B的日期|手机|家庭电话|商务电话|留言电话

建议吗?

2 个答案:

答案 0 :(得分:0)

您可以使用条件聚合

SELECT u.uname AS Name, u.udateofbirth AS 'Date of B.', 
       MAX(CASE WHEN p.ptype = 1 THEN p.pnumber END) AS 'Cell phone',
       MAX(CASE WHEN p.ptype = 2 THEN p.pnumber END) AS 'Home phone', 
       MAX(CASE WHEN p.ptype = 3 THEN p.pnumber END) AS 'Commercial phone',  
       MAX(CASE WHEN p.ptype = 4 THEN p.pnumber END) AS 'Message phone' 
FROM tblUser AS u 
JOIN phonerelation ON u.uid = phonerelation.uid 
JOIN tblPhoneNumber AS p ON p.pid = phonerelation.pid
GROUP BY 1, 2 

答案 1 :(得分:0)

我建议在usersphones之间建立多对多是不合适的。相反,只需要一个用户到多个手机。

然后像

CREATE TABLE Phones (
        uid ...,
        type ENUM('cell', 'home', ...),
        pnumber VARCHAR(20) CHARACTER SET ascii,
    PRIMARY KEY(uid, type, pnumber)
);

SELECT u.uname, ...
       GROUP_CONCAT(CONCAT(p.type, ': ', p.number) SEPARATOR ', ') AS 'Phone(s)'
    FROM Users u
    LEFT JOIN Phones p USING(uid)
    GROUP BY uid

相反,使用PRIMARY KEY(uid, type)会将每个用户限制为单个用户的单个Cell编号。 (这可能是一个理想的功能。)