2

我有一个名为的表:candidate_info有三列是id_userid_typevalue

  • id_type = 1 => 全名
  • id_type = 2 => 电子邮件
  • id_type = 3 => 邮寄地址
  • id_type = 4 => 电话号码

存储用户信息:

我考虑如下两个查询,它将从行组合到列:

表格原件:

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

到新:

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_fieldid_type,joinleft join使其有意义。

4

3 回答 3

2

您无法比较返回不同结果的查询。第一个版本会过滤掉没有4条记录的用户;第二个 - 不会。

如果您LEFT JOIN在第一个中使用,则比较是有意义的。在那种情况下,我会赌第二个;有一天,我比较了两种方法的性能(虽然不是在 mysql 上),Oracle 显示第一个版本更好,连接数达到 2;随着数量的增加,第二种方法的表现优于......

于 2012-12-26T16:34:37.307 回答
2

第二个查询更好,因为它不像第一个查询那样创建大的笛卡尔积。相反,它只迭代表的记录一次,发出包含每个组的聚合数据的行。

于 2012-12-26T16:34:57.503 回答
0

关于产生不同结果的查询,其他评论是正确的。假设每一行都有所有的整数(1、2、3、4),我会说运行一个测试应用程序来对它们进行基准测试。例如,将查询运行数千次,然后查看平均而言哪个更快。

于 2012-12-26T16:39:11.957 回答