【问题标题】:self join table自联接表
【发布时间】:2011-02-21 16:48:46
【问题描述】:

我有一张桌子,

new_id----old_id----created_on 1234------5678-----20100912 5678------3456-----20100808

等等

我写了这个查询,

$q = "select event1.new_id, event1.old_id, event1.created_on,event2.new_id, event2.old_id, event2.created_on
  FROM replaced_isbns event1
  JOIN replaced_isbns event2 
  ON event2.new_id = event1.old_id
  WHERE event1.new_id='$id'";

但我得到的结果为 5678 - 1234,即只有一行,我要所有行...

@webdestroya,

它只给出一行.... 我想要这样的输出, 对于 new_id 1234,old_id 是 5678,3456 等

【问题讨论】:

  • 在您的示例中,您的表仅包含 2 行。你的实际数据也是这样吗?

标签: php sql tsql


【解决方案1】:

如果您想要所有行而不是尝试 left outer join 并将 null 替换为新 id,例如

SELECT
    event1.new_id, event1.old_id, event1.created_on,
    IFNULL(event2.new_id, event1.new_id),
    IFNULL(event2.old_id, event1.old_id),
    event2.created_on
FROM replaced_isbns event1
LEFT OUTER JOIN replaced_isbns event2 
  ON event2.new_id = event1.old_id
WHERE event1.new_id='$id'

检查这可能对你有帮助

【讨论】:

  • @pranay,它不返回任何结果我想要这样的结果,对于 new_id 1234,old_id 是 5678,3456 等
  • 嗨,它只给我 1234 - 5678 但我想要,第二个结果也是 5678 - 3456 它应该返回所有行
  • 问题是如果您希望所有记录删除 where 子句,您将 id 放在您的 where 条件中,而不是您将获得所有数据
  • 我的意思是所有行,匹配 where 子句的行。我从用户那里得到 new_id,因此我必须选择其他行。请帮我。谢谢。
  • ORDER BY 子句是否适用于连接?我尝试在上面的选择查询中按 event1.created_on 排序,但我没有看到区别......
【解决方案2】:

为什么要进行自我加入?

SELECT replaced_isbns.*
FROM replaced_isbns
WHERE new_id = '$id'
OR old_id = '$id'

现在,对于结果中的每一行,检查 new_id = $id 或 old_id = $id。

【讨论】:

  • 它只给我 1234 - 5678,但我想要结果,对于 new_id 1234,old_id 是 5678,3456 等......它应该返回所有行......如表中所示。
【解决方案3】:

您将无法使用查询获得您想要的结果,因为无法在 SQL 中查询递归关系(好吧,Oracle 有 START WITH ... CONNECT BY ... 语法和 CTE,但是我猜你没有使用 Oracle :p)。

但另一方面,您可以尝试将此邻接列表转换为嵌套集,因为使用嵌套集很容易获得分支(给定父项的所有子记录)。 Managing Hierarchical Data in MySQL 是一篇关于该主题的有趣文章。

【讨论】:

    【解决方案4】:

    据我了解,您需要 new_id 的所有 old_id:- 对于 new_id:- 1234 旧 id' 是 5678 和 3456。 同样对于第二条记录:- 对于 new_id:- 5678 旧 id' 是 3456。 我已经对此进行了测试,并且工作正常。

    select new_id,b.old_id from 
       (select old_id from temp)
         as b inner join temp as a 
           on a.new_id!=b.old_id
    

    如果这是您想要的,请告诉我。 我希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2016-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      • 1970-01-01
      相关资源
      最近更新 更多