将 SQL 结果拆分为字段并将它们放入列中

Split SQL result into fields and turn them in Columns

我刚刚对 SELECT 查询有疑问。

在我的项目中,我有一个主要的 table 供用户使用,我还创建了一些 table 来拆分内容,如下所示:

tblUser uid 名字 出生日期 地址

tblPhoneNumber 进程号 uid p型 p数

tblPhoneRelation uid pid

我需要 SELECT 来自用户 table 的字段与 phone table 的结果,但问题是我需要拆分 phones 进入不同的领域,我的 phone 号码搜索可以 return 每个用户的 0 到 4 个结果。

我得到的与此类似,并给出了 Cell phone 的结果(在 ptype 中定义,例如 1 到 cell phone,2 代表 home phone , 3 用于商业 phone 和 4 用于消息):

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 的日期。单元格 phone

但我需要增加到:

姓名 | B 的日期。单元格 phone |首页 phone |商业 phone |留言 phone

有什么建议吗?

您可以为此使用条件聚合

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 

我建议在usersphones之间使用多对多是不合适的。相反,只有 1 个用户对多部手机。

然后像

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 号码。 (这可能是一个理想的功能。)