【问题标题】:SELECT with LEFT JOIN with two tables without duplicates带有 LEFT JOIN 的 SELECT 带有两个没有重复的表
【发布时间】:2020-09-23 21:16:31
【问题描述】:

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

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

我的目标是在每封电子邮件中仅获取不同的行,并选择 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      |
+-------+----------+------------+

【问题讨论】:

  • 显示你想要的结果。
  • 同时指定预期结果。

标签: mysql sql


【解决方案1】:

我猜你想要这样的东西:

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 仅检索每个 email 的该行。

【讨论】:

  • 您能解释一下这个查询是如何工作的吗?不知道 rom_number() over 和 partition 术语。
  • 您是否故意在 FROM 术语中将 t2 与 t1 切换?或者这也是有原因的。我应该指出,t1 远大于 t2。
  • @EldoRay。 . .您希望每封电子邮件有一行。这似乎是t2 所拥有的。因此,它是left join 中的第一个表。
【解决方案2】:

你可以这样做:

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 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 1970-01-01
    • 2016-05-07
    • 2013-03-13
    • 2014-09-27
    • 1970-01-01
    相关资源
    最近更新 更多