0

我有以下查询,它列出了所有具有匹配 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 上有一个索引认为这可能帮助,但它没有

4

2 回答 2

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 函数。

于 2012-07-19T08:40:52.023 回答
0

小费:

  • 在附带的列上创建索引ONWHERE

  • 改变SELECT_SELECT STRAIGHT JOIN

于 2012-07-19T08:30:12.783 回答