我有一个联系人表,其中contact_type_id表示:
1-电子邮件
2 - 电话
3 - skype
以下示例显示了具有不同类型联系人的3个不同用户。
第一位用户拥有电话号码和Skype。第二个只有电子邮件。第三种类型有三种类型:电子邮件,电话号码和电话号码。 Skype的。
user_id contact_type_id value
1 2 353234
1 3 skypeLogin
2 1 example@mail.com
3 1 example2@mail.com
3 2 123345
3 3 skypeLogin2
需要澄清问题 我如何选择此数据,如下表
user_id email phone skype
1 null 353234 skypeLogin
2 example@mail.com null null
3 example2@mail.com 123345 skypeLogin2
答案 0 :(得分:2)
Pivot是您正在寻找的。如果你有contact_type_id
未知数量的谷歌动态数据透视 - 那么就有大量的例子。
这适用于SQL Server:
CREATE TABLE #Contacts
(
user_id INTEGER
,contact_type_id INTEGER
,value NVARCHAR(20)
);
INSERT INTO #Contacts
( user_id, contact_type_id, value )
VALUES
( 1, 2, '353234' ),
( 1, 3, 'skypeLogin' ),
( 2, 1, 'example@mail.com' ),
( 3, 1, 'example2@mail.com' ),
( 3, 2, '123345' ),
( 3, 3, 'skypeLogin2' );
SELECT
pvt.user_id
,pvt.[1] email
,pvt.[2] phone
,pvt.[3] skype
FROM
#Contacts
PIVOT( MAX(value) FOR contact_type_id IN ( [1], [2], [3] ) ) pvt;
user_id email phone skype
----------- -------------------- -------------------- --------------------
1 NULL 353234 skypeLogin
2 example@mail.com NULL NULL
3 example2@mail.com 123345 skypeLogin2
(3 row(s) affected)
答案 1 :(得分:2)
如果 MySQL 然后使用CASE WHEN
和GROUP BY
SELECT
user_id,
MAX(CASE WHEN contact_type_id = 1 THEN `value` END) AS email,
MAX(CASE WHEN contact_type_id = 2 THEN `value` END) AS phone,
MAX(CASE WHEN contact_type_id = 3 THEN `value` END) AS skype
FROM your_table
GROUP BY user_id
答案 2 :(得分:1)
这适用于sql server和mysql。注意值应该在sql server中转义。
USE sandbox;
/*
create table users(user_id int,contact_type_id int, value varchar(20));
insert into users values
(1, 2, '353234'),
(1, 3, 'skypeLogin'),
(2, 1, 'example@mail.com'),
(3, 1, 'example2@mail.com'),
(3, 2, '123345'),
(3, 3, 'skypeLogin2');
*/
select user_id,
max(case when contact_type_id = 1 then value else '' end) as email,
max(case when contact_type_id = 2 then value else '' end) as tel,
max(case when contact_type_id = 3 then value else '' end) as skpe
from users
group by user_id;
答案 3 :(得分:0)
一个是Pivot表,其他可以低于逻辑: 创建3个表: 1.使用user_id和仅用于电子邮件的值,即contact_type_id = 1 2.使用user_id和仅用于电话的值,即contact_type_id = 2 3.使用user_id和仅用于skype的值,即contact_type_id = 3 4.外面加入三个表。
下面的代码也是如此:
Select A.user_id,A.value as email, B.value as Phone, C.Value as Skype
from contacts A
outer join contacts B
On A.User_id=B.User_ID and A.value=1 and B.value=2
outer join contacts C
On A.User_id=C.User_ID and C.Value=3