繁体   English   中英

SELECT 与 LEFT JOIN 与两个没有重复的表

[英]SELECT with LEFT JOIN with two tables without duplicates

我有两张桌子。 除了 email 之外,两者都有不同的值。 我来自两个表的 select 与同一个 email 上的第二个表的左连接。 不幸的是,第一个表中有重复的电子邮件。

+-------+----------+------+
| 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   |
+-------+----------+------+

我的目标是每个 email 只获得不同的行,选择 table1 的最高 id 行

到目前为止,我的查询看起来像这样:

SELECT t2.email, t1.address, t2.city
FROM t1
LEFT JOIN t2 ON t1.email = t2.email
WHERE t1.email IS NOT NULL 

如果没有这些重复项,我如何获得想要的结果?

编辑

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

我猜你想要这样的东西:

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()是一个 window function ,它为具有相同 email 的行分配一个序号 - 最高id递减为“1”,然后随着递增。 这标识了具有最大 id 的行,并且seqnum = 1仅检索每个email的该行。

你可以这样做:

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 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM