加速SQL查询并修复连接

时间:2012-07-19 08:10:15

标签: mysql sql

我有以下查询,其中列出了所有具有匹配的facebook帐户的帐户 - 问题是,有时facebook表中有多行与匹配匹配,然后我们会重复返回重复行,即使是ac .id AS id应该是唯一的主键。

SELECT ac.id AS id
    , ac.first_name
    , ac.last_name
    , ac.email
    , ac.company_name
    , upd8r_facebook_accts.id AS fb
FROM upd8r_user_accts ac
LEFT OUTER JOIN upd8r_facebook_accts 
    ON ac.id = upd8r_facebook_accts.user_id
WHERE ac.`rfid` =  ''
AND ac.last_name !=  ''
AND ac.`owner_id` =  '121'
ORDER BY ac.`last_name` ASC 

两个问题是返回重复的行(我认为当facebook表中有多行与upd8r_user_accts.id匹配时。并且查询需要10秒才能运行...我有一个关于upd8r_user_accts.id的索引认为这可能有所帮助,但它没有

2 个答案:

答案 0 :(得分:0)

小费:

  • ONWHERE

  • 附带的列制作索引
  • SELECT

  • 更改SELECT STRAIGHT JOIN

答案 1 :(得分:0)

由于upd8r_user_accts.id是主键 - 在此列上添加索引无关紧要,因此是多余的。 您的查询结果表明一些用户有多个Facebook帐户。 您没有说明id列的数据类型,但您可以尝试这样的事情..

SELECT ac.id AS id, ac.first_name, ac.last_name, ac.email, ac.company_name, upd8r_facebook_accts.id AS fb
FROM upd8r_user_accts ac
LEFT OUTER JOIN upd8r_facebook_accts ON ac.id = upd8r_facebook_accts.user_id
WHERE ac.`rfid` =  ''
AND ac.last_name !=  ''
AND ac.`owner_id` =  '121'
AND upd8r_facebook_accts.id = (SELECT MAX(ufa.id) FROM upd8r_facebook_accts ufa WHERE ufa.user_id = ac.id)
ORDER BY ac.`last_name` ASC

这会产生每个用户只显示一行的效果,但请记住,它删除的行可能不是您想要从结果中删除的行。 它还假设您可以在Id列上执行MAX功能。