【问题标题】:Split SQL result into fields and turn them in Columns将 SQL 结果拆分为字段并将它们转换为列
【发布时间】:2016-05-20 18:44:56
【问题描述】:

我刚刚对 SELECT 查询有疑问。

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

tbl用户 uid 无名 出生日期 优衣库

tblPhoneNumber PID uid 类型 编号

tblPhoneRelation uid PID

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

我得到的与此类似,并给了我手机的结果(在 ptype 中定义,例如 1 到手机,2 用于家庭电话,3 用于商用电话,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.的日期。手机

但我需要增加到:

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

建议?

【问题讨论】:

标签: mysql mariadb


【解决方案1】:

您可以为此使用条件聚合

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 

【讨论】:

  • Ty vm 提供帮助,但我正在尝试在另一个地方使用此代码来创建用户电话列表并拆分为 Lazarus (Delphi) 上的字段,我尝试对其进行编辑一点点,但我在结果列表中得到了不止一行。当我只选择电话号码时,我需要削减什么,用户存储在一个 var 中,所以我不需要研究用户表来进行 id 比较。
【解决方案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),它会将每个用户限制为单个用户的单个单元格号码。 (这可能是一个理想的功能。)

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 2019-03-25
    相关资源
    最近更新 更多