需要对查询有一点帮助。使用DISTINCT返回其他列的MySQL
SELECT id,email FROM user_info WHERE username!=''
AND email='[email protected]'
GROUP BY email ORDER BY id DESC LIMIT 1
这是什么目前取得一个不同的电子邮件,但不是此电子邮件下的帐户的最新ID。
需要对查询有一点帮助。使用DISTINCT返回其他列的MySQL
SELECT id,email FROM user_info WHERE username!=''
AND email='[email protected]'
GROUP BY email ORDER BY id DESC LIMIT 1
这是什么目前取得一个不同的电子邮件,但不是此电子邮件下的帐户的最新ID。
这听起来像您可以应用聚合到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]';
如果,那么这里有一个方法,使使用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
我认为对这项任务使用交叉连接是矫枉过正的,而第二个例子没有用处。 – 2013-02-12 02:26:52
@Octopi:感谢您的评论。我不明白你的意思是“矫枉过正”。内联视图的目的是初始化一个用户变量。忽略内联视图并在单独的语句中执行初始化对性能没有影响。 CROSS关键字是可选的,它被MySQL忽略并且对生成的计划没有影响。第二条语句演示了另一种技术,在SELECT列表中使用相关子查询。而且我发现这种技术对于在某些情况下不可缺少的地方是有用的。 – spencer7593 2013-02-12 14:09:59
这很好用。不过,我实际上需要返回一个用户名。在用户名列下找到。每个新的ID都有一个新的用户名。 – David 2013-02-11 21:24:30
由于您已经拥有'email ='示例@ gmail.com'',所以'GROUP BY email'没有用处/需要。 – 2013-02-11 21:24:49
@David你会有多个用户名为每个电子邮件?还是只有一个? – Taryn 2013-02-11 21:26:06