Mysql 将SQL结果拆分为字段并在列中转换它们

Mysql 将SQL结果拆分为字段并在列中转换它们,mysql,mariadb,Mysql,Mariadb,我只是对一个精选的查询有点怀疑 在我的项目中,我为用户创建了一个主表,并创建了更多的表来拆分内容,如下所示: 特布卢瑟 液体 uname 出生日期 服装 tblPhoneNumber pid 液体 P型 pnumber TBLPHONERATION 液体 pid 我需要从带有电话表结果的用户表中选择字段,但问题是我需要将电话拆分为不同的字段,我的电话号码搜索可以为每个用户返回0到4个结果 我得到的结果与此类似,并给出了手机的结果(在ptype中定义为1表示手机,2表示家用电话,3表示商用电话,4

我只是对一个精选的查询有点怀疑

在我的项目中,我为用户创建了一个主表,并创建了更多的表来拆分内容,如下所示:

特布卢瑟 液体 uname 出生日期 服装

tblPhoneNumber pid 液体 P型 pnumber

TBLPHONERATION 液体 pid

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

我得到的结果与此类似,并给出了手机的结果(在ptype中定义为1表示手机,2表示家用电话,3表示商用电话,4表示短信):

我的结果呢

姓名|出生日期|手机

但我需要增加到:

姓名| B.日期|手机|家用电话|商用电话|短信电话

建议?

您可以为此使用条件聚合:

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 

我建议在
用户
手机
之间设置多对多是不合适的。取而代之的是一对多的手机

然后像

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

相反,使用
主键(uid,type)
,它会将每个用户限制为单个用户的单个单元格编号。(这可能是一个理想的功能。)

您可以在帮助中发布一些表格/数据吗,但我正在尝试在另一个地方使用此代码创建用户电话列表,并在Lazarus(Delphi)上拆分为字段,我尝试对其进行一点编辑,但结果列表中的行数超过了一行。当我只选择电话号码时,我需要削减的是,用户存储在一个var中,因此我不需要对用户表进行id比较研究。
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