2016-02-13 45 views
1

我有一个表与艺术家和另一个与打印。我想从表格Artist中获取所有内容,并从表格Prints中获取print_id。想象一下,如果我有3位艺术家A,B和C.想象一下,艺术家A和B是否参加了印刷品1并且还参与了2.艺术家C参与了印刷品2和3.我想要的是关于艺术家A和B的信息,因为他们参与了打印1,而且还打印了他们参与的其他打印件(在这种情况下,打印2)。如何将两个选择与连接相交? SQL

表艺术家: 艺术家A - 巴西。 艺术家B - 美国。 艺术家C - 比利时。

表格打印: 1-波。 2 - 地图。 3 - 晚上。

结果预计: 艺术家A - 巴西 - 1 艺术家A - 巴西 - 2 艺术家乙 - 美国 - 1 艺术家乙 - 美国 - 2

我想是这样,但我得到了一些错误......

SELECT 
    * 
FROM 
    (SELECT DISTINCT 
     artist.* 
     ,print.print_id 
    FROM 
     artist 
     JOIN print ON artist.artist_id = print.artist_id 
    WHERE 
     print.print_id = 1 
    INTERSECT 
    SELECT DISTINCT 
     artist.* 
     ,print.print_id 
    FROM 
     artist JOIN print ON artist.artist_id = print.artist_id 
    ) 
+1

你会得到哪些错误? – Ygalbel

+0

Mysql不支持相交,你必须改用inner join。 – Shadow

+1

我是否错过了某些东西,或者这两个查询是相同的,除了第一个在'print_id = 1'上过滤的东西。如果是这种情况,那么第一个查询不会产生你想要的结果?我多次阅读它以确保我不会在代码中遗漏某些内容,但是如果我愿意,请告诉我。 – Nicarus

回答

0

您可以尝试使用连接的表(选择)你有

SELECT * FROM (
    SELECT DISTINCT 
     Artist.*, 
     Print.print_id 
    FROM Artist 
    JOIN Print 
    ON Artist.artist_id = Print.artist_id 
    WHERE Print.print_id=1 
    ) as T1 
JOIN 
    (
    SELECT DISTINCT 
     Artist.*, 
     Print.print_id 
    FROM Artist 
    JOIN Print ON Artist.artist_id = Print.artist_id 
    ) as T2 
    ON T1.artist_id = T2.artist_id 

本质上选择是在表中,而INTERSESCT对应于内部联接与两个表的联合键的键/选择

+0

这与第一个查询(T1)返回的内容有何不同? – Nicarus

+0

只是不使用相交.. – scaisEdge

+0

我认为这是一个测试查询...测试相交..(我不知道为什么OP使用此代码...我只是试图解决与相交有关的问题在mysql中) – scaisEdge

0

我能理解查询的唯一合理的方式是假定WHERE子句从第二个子查询。

如果你想使用join检查,如果一个艺术家有两个打印,然后:

SELECT a.* 
FROM Artist a JOIN 
    Print p1 
    ON a.artist_id = p1.artist_id AND p1.print_id = 1 JOIN 
    Print p2 
    ON a.artist_id = p2.artist_id AND p2.print_id = 2; 

我认为没有理由选择在SELECTprint_id,因为艺术家同时具备。