自联接表

时间:2010-05-20 04:51:15

标签: php sql tsql

我有一张桌子,

    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等

4 个答案:

答案 0 :(得分:0)

如果您想要所有行而不是尝试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'

检查这可能会对你有所帮助

答案 1 :(得分:0)

为什么要自我加入?

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

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

答案 2 :(得分:0)

据我所知,你需要new_id的所有old_ids: - for new_id: - 1234 old id'是5678和3456。 类似的第二条记录: - 对于new_id: - 5678 old 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

请告诉我这是否是您想要的。 我希望这有帮助!

答案 3 :(得分:0)

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

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