从两个连接的表中选择一个表中的一列由另一个表中的两个引用

问题描述:

我有两个表,分别用于存储网页URL及其连接(超链接)的页和超链接。在Page表中,我有一个对所有唯一条目都是AUTO_INCREMENT的page_id列。在超链接表中,我使用page_id作为超链接的源和目标。从两个连接的表中选择一个表中的一列由另一个表中的两个引用

表:页

page_id | page_url 
-------------------- 
    1  | a.com 
    2  | b.com 
    3  | c.com 
    4  | d.com 

表:超链接

hyperlink_id | source_id | destination_id 
1   | 1   | 2 
2   | 1   | 3 
3   | 2   | 4 
4   | 4   | 4 

我希望检索返回我在一排,a.com和b.com两个字符串一个结果,给出的hyperlink_id 。假设hyperlink_id是1.

我试过使用下面的查询,但它似乎没有工作。

SELECT Page.page_url, Page.page_url from Hyperlink 
JOIN Page 
ON Page.page_id = Hyperlink.source_id 
AND Page.page_id = Hyperlink.destination_id 
where Hyperlink.hyperlink_id = 1 

该查询返回给我一个空的ResultSet。

但是,此查询适用于hyperlink_id = 4.我认为此查询在source_id != destination_id时不起作用。我的SELECT语句有什么问题?

你的查询可以被改写为:

SELECT Page.page_url, Page.page_url 
    FROM Hyperlink 
    JOIN Page 
    ON Page.page_id = Hyperlink.source_id 
    AND Hyperlink.source_id = Hyperlink.destination_id 
WHERE Hyperlink.hyperlink_id = 1 

这意味着Hyperlink.source_id必须等于Hyperlink.destination_id,你只需要在你的表中的一行的满足此条件。其中一个在那里hyperlink_id = 4

也许你的意思是下面的意思?

SELECT p1.page_url, p2.page_url 
    FROM Hyperlink 
    JOIN Page p1 
    ON p1.page_id = Hyperlink.source_id 
    JOIN Page p2 
    AND p2.page_id = Hyperlink.destination_id 
WHERE Hyperlink.hyperlink_id = 1 

这将访问Page表两次,以获得您所需要两个不同标识

+0

嗨的信息,谢谢您的回答。我想显示所有超链接的所有page_url,而不仅仅是source = destination的那些。 – paperclip 2012-08-12 12:12:26

+1

在你的编辑中,它说在第一行的Page1.page_url,应该是p1呢? – paperclip 2012-08-12 12:14:23

+0

确实,对不起。 – Ben 2012-08-12 12:15:07