1

在查询方面需要一点帮助。

SELECT id,email FROM user_info WHERE username!='' 
     AND email='example@gmail.com' 
     GROUP BY email ORDER BY id DESC LIMIT 1

目前所做的是获取一个不同的电子邮件,但不是该电子邮件下帐户的最新 ID。

4

2 回答 2

2

听起来您可以将聚合应用于该id字段,它将返回每封电子邮件的最新 ID:

SELECT Max(id), email 
FROM user_info 
WHERE username!='' 
  AND email='example@gmail.com' 
GROUP BY email 

不幸的是,当您应用GROUP BY没有聚合的 a 时,id除非您指定选择最大值,否则无法保证将返回什么。

如果要返回与 关联的用户名,max(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='example@gmail.com' 
  group by email
) i
  on u.id = i.maxid
  and u.email = i.email
WHERE username!='' 
  AND email='example@gmail.com';
于 2013-02-11T21:21:39.790 回答
-1

如果“最新 id”是指最大值,那么这是一种利用 MySQL 用户变量来保留先前行的值的方法,因此可以进行比较:

SELECT IF(u.email=@prev_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 = 'example@gmail.com'
 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 = 'example@gmail.com'
             AND u.username != '' 
           GROUP BY u.email
        ) e
于 2013-02-11T21:53:18.193 回答