Mysql 选择带有两个不重复表的左联接

Mysql 选择带有两个不重复表的左联接,mysql,sql,Mysql,Sql,我有两张桌子。除了电子邮件之外,这两个文件都有不同的值。我从两个表中选择,并在同一封电子邮件中左连接第二个表。不幸的是,第一个表中有重复的电子邮件 +-------+----------+------+ | email | address | id | +-------+----------+------+ | a | a | 1 | | b | b | 2 | | c | c | 3 | | a

我有两张桌子。除了电子邮件之外,这两个文件都有不同的值。我从两个表中选择,并在同一封电子邮件中左连接第二个表。不幸的是,第一个表中有重复的电子邮件

+-------+----------+------+
| email | address  | id   |
+-------+----------+------+
|  a    |    a     |  1   |
|  b    |    b     |  2   |
|  c    |    c     |  3   |
|  a    |    d     |  4   |
+-------+----------+------+

+-------+----------+------+
| email | password | etc  |
+-------+----------+------+
|  a    |    a     |  1   |
|  b    |    b     |  2   |
|  c    |    c     |  3   |
|  d    |    d     |  4   |
+-------+----------+------+
我的目标是在选择表1中id最高的行时,每封电子邮件只能获得不同的行

到目前为止,我的查询如下所示:

SELECT t2.email, t1.address, t2.city
FROM t1
LEFT JOIN t2 ON t1.email = t2.email
WHERE t1.email IS NOT NULL 
如果没有这些副本,我如何获得想要的结果

编辑


我猜你想要这样的东西:

select t2.*, t1.*
from t2 left join
     (select t1.*, row_number() over (partition by email order by id desc) as seqnum
      from t1
     ) t1
     on t1.email = t2.email and t1.seqnum = 1;
row_number是一个窗口函数,它为具有相同电子邮件的行分配一个序列号-最高id为1,然后随着id的减少而递增。这将标识id最大的行,seqnum=1仅为每封电子邮件检索该行。

您可以执行以下操作:

select temp.email, t1.address, t2.password from
  (select max(id) as max_id, email from table1
  group by email) temp 
  Left join table1 t1 on t1.id = temp.max_id
  Left join table2 t2 on t2.email = temp.email 

显示所需的结果。同时指定预期结果。请解释此查询的工作原理?不知道rom_数和分区项。你是否故意在FROM项中将t2与t1切换?或者这也有原因。我应该指出t1比t2大得多。@EldoRay。您希望每封电子邮件一行。这似乎就是t2的功能。因此,它是左联接中的第一个表。
select temp.email, t1.address, t2.password from
  (select max(id) as max_id, email from table1
  group by email) temp 
  Left join table1 t1 on t1.id = temp.max_id
  Left join table2 t2 on t2.email = temp.email