我有一个名为candidate_info
的表有三列id_user
,id_type
和value
:
存储用户信息:
我考虑如下两个查询,它将从行到列合并:
表格原件:
Id User | Id Type | Value
1 | 1 | John
1 | 2 | john@g.com
1 | 3 | Ho Chi Minh
1 | 4 | 123
2 | 1 | Ana
2 | 2 | ana@g.com
2 | 3 | New York
2 | 4 | 456
To New:
Id User | Fullname | Email | Mailing_Address | Phone Number
1 | John | john@g.com | Ho Chi Minh | 123
2 | Ana | ana@g.com | New York | 456
1。第一个查询:
select
c1.id_user,
c1.value as fullname,
c2.value as email,
c3.value as mailing_address,
c4.value as phone_number
from
candidate_info c1
left join
candidate_info c2 ON c1.id_user = c2.id_user
left join
candidate_info c3 ON c1.id_user = c3.id_user
left join
candidate_info c4 ON c1.id_user = c4.id_user
where
c1.id_type = 1
and c2.id_type = 2
and c3.id_type = 3
and c4.id_type = 4;
2。第二次查询
select
c.id_user,
MAX(IF(c.id_type = 1, c.value, NULL)) as fullname,
MAX(IF(c.id_type = 2, c.value, NULL)) as email,
MAX(IF(c.id_type = 3, c.value, NULL)) as mailing_address,
MAX(IF(c.id_type = 4, c.value, NULL)) as phone_number
from
candidate_info c
where
c.id_type in (1, 2, 3, 4)
group by c.id_user
哪个更好?
修改:将id_entry_field
更改为id_type
,将join
更改为left join
,以便有意义。
答案 0 :(得分:2)
您无法比较返回不同结果的查询。第一个版本将过滤掉没有4条记录的用户;第二个 - 不会。
如果您在第一个中使用LEFT JOIN
,则比较会有意义。在那种情况下,我会打赌第二个;有一天我比较了两种方法的性能(虽然不是mysql),Oracle显示第一版更好,连接数最多为2;第二种方法表现更好......
答案 1 :(得分:2)
第二个查询更好,因为它不会像第一个查询那样创建大型笛卡尔积。相反,它只迭代表的记录一次,发出一行包含每个组的聚合数据。
答案 2 :(得分:0)
其他评论对于产生不同结果的查询是正确的。假设每行都有所有的entires(1,2,3,4),我会说运行一个测试应用程序来对它们进行基准测试。例如运行查询的时间几千次,看看哪一个平均更快。