我对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的日期|手机|家庭电话|商务电话|留言电话
建议吗?
答案 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)
我建议在users
和phones
之间建立多对多是不合适的。相反,只需要一个用户到多个手机。
然后像
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编号。 (这可能是一个理想的功能。)