【问题标题】:how to join table A and table B without duplicating rows in table A?如何在不重复表A中的行的情况下连接表A和表B?
【发布时间】:2012-10-14 00:43:37
【问题描述】:

我正在尝试连接两个表:表 A 和表 B。表 A 的每一行都有唯一的 ID,并且在表 B 中具有相应的 ID,但在表 B 中,ID 可以出现多次。

每当我尝试内部联接时,我都会因为表 B 得到重复的行,所以我想知道如何在没有这些重复的情况下加入。

基本上,对于表 A 的每一行,我只想要表 B 中的一条记录,但它没有发生。

编辑:

SELECT p.post_title, tt.cntaccess FROM wp_posts as p INNER JOIN wp_top_ten as tt ON p.ID = tt.postnumber WHERE p.post_date > '2000-01-02 00:00:00' AND tt.cntaccess > '10'

【问题讨论】:

  • 您可以粘贴您已经尝试过的 SQL 查询吗?
  • 并非如此。您的意思是您希望抑制 A 中如果订购并链接到 B 时自然会出现的 vales?
  • 如果不是全部,您希望从表 B 中包含哪些记录?

标签: mysql join


【解决方案1】:

这会将 a 与具有最新日期的相应 b 连接起来,如果有多个 b 匹配该条件,则 b 具有最高 id。 b.id 和 a.id 被假定为唯一的(或主键)。

SELECT a.id
     , b.id
     , b.date
  FROM a
  JOIN b
    ON a.id = b.a_id
  LEFT JOIN b AS b2
    ON b.a_id = b2.a_id
   AND (b.date, b.id) < (b2.date, b2.id)
 WHERE b2.id IS NULL
;

这是我尝试将您的表格与您的逻辑结合使用。请注意,我指的是 tt.pk。此 pk 表示预期行为的唯一键或主键。您没有提供足够的详细信息来了解此信息。我还没有测试过下面的 SQL。上面的测试SQL已经测试过了。

SELECT p.post_title
     , tt.cntaccess
     , p.ID
     , tt.pk 
  FROM wp_posts AS p
  JOIN wp_top_ten AS tt
    ON p.id = tt.postnumber 
   AND tt.cntaccess > '10'
  LEFT JOIN wp_top_ten as tt2
    ON tt.postnumber = tt2.postnumber 
   AND tt2.cntaccess > '10'
   AND (tt.date, tt.pk) < (tt2.date, tt2.pk) 
 WHERE tt2.postnumber IS NULL 
   AND p.post_date > '2000-01-02 00:00:00'
; 

【讨论】:

  • 请注意,您可以用任何唯一标识符替换该不等式,如下所示:AND (tt.pk)
【解决方案2】:

您需要使用SELECT 语句指定您需要哪个表中的哪些字段... 因此,不要使用SELECT * FROM...,而是使用SELECT tablea.id, tablea.etc... FROM... 并省略那些你不需要的(在你的情况下是表B 中的ID)。

【讨论】:

  • 从您编辑的代码来看,我相信您需要使用p RIGHT JOIN tt 而不是INNER JOIN。您只需要前十个帖子(总共十行),对吧?
猜你喜欢
  • 2021-03-16
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
相关资源
最近更新 更多