需要一些查询帮助。
SELECT id,email FROM user_info WHERE username!=''
AND email='example@gmail.com'
GROUP BY email ORDER BY id DESC LIMIT 1
目前这样做的目的是获取不同的电子邮件,但不是此电子邮件下帐户的最新ID。
答案 0 :(得分:2)
听起来您可以将汇总应用于id
字段,它会返回每封电子邮件的最新ID:
SELECT Max(id), email
FROM user_info
WHERE username!=''
AND email='example@gmail.com'
GROUP BY email
不幸的是,当您应用没有聚合的GROUP BY
时,除非您指定选择最大值,否则无法保证将返回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';
答案 1 :(得分:-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