Mysql SQL-如何选择多行

Mysql SQL-如何选择多行,mysql,sql,Mysql,Sql,我有两个表,成员和捐款由成员ID链接。成员有许多重复项。我想删除它们,但在删除之前,我想将一个成员在捐赠中的条目更新为一个ID,在Sara Tam的情况下,可能是最大值456 是否有一个查询来选择Sara的所有成员和其他有捐赠条目但Fred没有的成员?我如何关联ID 123和456 members donations ----------- ----------- 123 Sara Tam 123 20.00 456

我有两个表,成员和捐款由成员ID链接。成员有许多重复项。我想删除它们,但在删除之前,我想将一个成员在捐赠中的条目更新为一个ID,在Sara Tam的情况下,可能是最大值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

尝试选择成员。*从成员、捐款中选择捐款。ID!=MEMBERS.ID它将为您提供成员中ID不在捐赠中的所有行。我的语法可能有点不正确,但有关更多信息,请参阅有关联接的文档,如中的这篇文章。

这将找到所有额外重复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

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

如果是这样的话,那么这应该是可行的-但是,您不应该有两个具有相同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;

请发布您的表格结构。还有,Sara的最大ID是789,对吗?Sara与Fred共享她的一个会员ID 789?Fred的ID应该是其他的。抱歉输入错误。他想要所有捐款的会员以及他们的所有其他ID。Fred的ID应该是其他的…抱歉。您是否能够重申这一点,以便查询只选择捐赠中的记录,它将使用成员的最大ID更新这些记录?谢谢SGEDES-在我实际执行更新之前,我想知道以下几点:对于所有捐赠ID,成员中是否有多个ID?在我将Sara的ID更新到789之前,我需要知道她在会员中的所有ID,然后使用max更新她的捐款记录。嗨,Barmar。我有重复的成员和一些捐款可能是根据不同的成员的ID,真正属于一个人在成员。我想知道的是,是否有任何捐款记录指向会员中超过1个记录。
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;