SQL - 如何选择多行

时间:2013-02-26 01:44:01

标签: mysql sql

我有两个表,会员和捐款由会员ID链接。成员有很多重复。我想删除它们,但在此之前,我想将捐赠中的成员条目更新为单个ID - 在Sara Tam的情况下可能是MAX值(456)。

是否有一个查询选择所有Sara的成员(以及其他在捐赠中有条目但没有Fred的人没有?我如何关联ID 123和456?

   members          donations
    -----------     -----------
    123 Sara Tam        123   20.00   
    456 Sara Tam        123   40.00 
    789 Sara Tam        333   10.00
     .                  444   30.00 
     .                  999   30.00 
    789 Fred Foo

3 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,您希望将您的Donations表更新为与成员关联的MAX Id,并删除Members表中保留MAX的重复记录。

如果是这样,那么这应该有效 - 但是,您不应该有2个具有相同ID的成员:

UPDATE Donations D
  JOIN Members M ON M.MemberId = D.MemberId
  JOIN (SELECT Max(MemberId) MaxId, Name
        FROM Members 
        GROUP BY Name
      ) M2 ON M.Name = M2.Name
SET D.MemberId = M2.MaxId;

DELETE M
FROM Members M
  JOIN Members M2 ON M.Name = M2.Name AND M.MemberId < M2.MemberId;

SQL Fiddle Demo

发表您的意见,也许您只是在寻找SQL语句来显示更新的捐赠与MAX(Id)。如果是这样,那么这应该有效:

SELECT M2.MaxId MemberId, D.Amount
FROM Donations D
  JOIN Members M ON M.MemberId = D.MemberId
  JOIN (SELECT Max(MemberId) MaxId, Name
        FROM Members 
        GROUP BY Name
      ) M2 ON M.Name = M2.Name;

updated fiddle

答案 1 :(得分:0)

尝试SELECT MEMBERS.* FROM MEMBERS, DONATIONS WHERE DONATIONS.ID != MEMBERS.ID它将为您提供成员中具有不在捐赠中的ID的所有行。我的语法可能有些偏差,但请参阅有关联接的文档,例如来自informIT的这篇文章以获取更多信息。

答案 2 :(得分:0)

这将找到所有额外重复ID的最大成员ID:

select m1.member_id, max(m2.member_id) maxid
from members m1
join members m2 on m1.name = m2.name and m1.member_id < m2.member_id

将其限制为仅捐赠的用户:

select m1.member_id, max(m2.member_id) maxid, count(*) duplicates
from members m1
join (select distinct member_id from donations) d on m1.member_id = d.member_id
join members m2 on m1.name = m2.name and m1.member_id < m2.member_id
having duplicates > 1