将 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
我建议在users
和phones
之间使用多对多是不合适的。相反,只有 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 号码。 (这可能是一个理想的功能。)
我刚刚对 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
我建议在users
和phones
之间使用多对多是不合适的。相反,只有 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 号码。 (这可能是一个理想的功能。)