2013-02-11 72 views

回答

2

这听起来像您可以应用聚合到id领域,它将返回最近的ID为每封电子邮件:

SELECT Max(id), email 
FROM user_info 
WHERE username!='' 
    AND email='[email protected]' 
GROUP BY email 

不幸的是,当你申请一个GROUP BY没有总也不能保证什么除非您指定选择最大值,否则将返回id

如果要返回与max(id)关联的用户名,那么你可以使用子查询:通过“最新的ID的”你的意思是最大的价值

SELECT i.MaxId, 
    i.email, 
    u.username 
FROM user_info u 
inner join 
(
    select max(id) MaxId, email 
    from user_info 
    WHERE username!='' 
    AND email='[email protected]' 
    group by email 
) i 
    on u.id = i.maxid 
    and u.email = i.email 
WHERE username!='' 
    AND email='[email protected]'; 
+0

这很好用。不过,我实际上需要返回一个用户名。在用户名列下找到。每个新的ID都有一个新的用户名。 – David 2013-02-11 21:24:30

+1

由于您已经拥有'email ='示例@ gmail.com'',所以'GROUP BY email'没有用处/需要。 – 2013-02-11 21:24:49

+0

@David你会有多个用户名为每个电子邮件?还是只有一个? – Taryn 2013-02-11 21:26:06

-1

如果,那么这里有一个方法,使使用MySQL的用户变量保留以前行的价值,所以比较可以制成:

SELECT IF([email protected]_email,1,0) AS dup_email_ind 
    , u.id 
    , u.username 
    , @prev_email := u.email AS email 
    FROM user_info u 
CROSS 
    JOIN (SELECT @prev_email := NULL) i 
WHERE u.username != '' 
    AND u.email = '[email protected]' 
GROUP 
    BY u.email DESC 
    , u.id  DESC 
    , u.username DESC 

这将返回所有的行,与该行是否被认为是一个较旧的一个指标“重复”电子邮件或不。具有dup_email_ind = 1的行被识别为旧的重复项,dup_email_ind = 0表示该行是给定电子邮件值的最新行(具有最大id值的行)。

(通常,当我在寻找这样的重复,这有助于我回两个,或全部,这是“重复”行。)

若要只返回行“最新的ID”,包裹上面的查询(作为共线视图)中的另一个查询:从查询的输出被用于外部查询的行源)

SELECT d.* 
    FROM (
     -- the query above gets put here 
     ) d 
WHERE d.dup_mail_ind = 0 

另一种方法是使用一个。 SELECT列表中的相关子查询,尽管这实际上只适用于返回小集合。 (这种方法对于大型设备可能会有严重的性能问题。)

SELECT (SELECT u1.id 
      FROM user_info u1 
      WHERE u1.email = e.email 
      AND u1.username != '' 
      ORDER BY u1.id DESC 
      LIMIT 1 
     ) AS id 
     , (SELECT u2.username 
      FROM user_info u2 
      WHERE u2.email = e.email 
      AND u2.username != '' 
      ORDER BY u2.id DESC 
      LIMIT 1 
     ) AS username 
     , e.email 
    FROM (SELECT u.email 
      FROM user_info u 
      WHERE u.email = '[email protected]' 
      AND u.username != '' 
      GROUP BY u.email 
     ) e 
+0

我认为对这项任务使用交叉连接是矫枉过正的,而第二个例子没有用处。 – 2013-02-12 02:26:52

+0

@Octopi:感谢您的评论。我不明白你的意思是“矫枉过正”。内联视图的目的是初始化一个用户变量。忽略内联视图并在单独的语句中执行初始化对性能没有影响。 CROSS关键字是可选的,它被MySQL忽略并且对生成的计划没有影响。第二条语句演示了另一种技术,在SELECT列表中使用相关子查询。而且我发现这种技术对于在某些情况下不可缺少的地方是有用的。 – spencer7593 2013-02-12 14:09:59