2016-01-04 36 views
-1

比方说,我有3个表:用户,订阅和premium_subscriptionsSQL 3表连接前两个内再外

  • 用户有ID,名字,姓氏等
  • 订阅有ID,USER_ID,magazine_id等
  • premium_subscriptions有ID,magazine_id邀请,USER_ID

我想获得指定用户所属的所有订阅,然后在最后一列指出用户是否是高级订户(如premium_subscription id或null)。

所以我认为前两个表是用户标识的标准内连接。这将获得我想要的所有行,然后是另一个保持所有相同行的联接,但如果用户有关系,则获取premium_subcription id;如果没有,则返回null。

这可能与一个单一的查询?

+0

我建议你也看看这里:http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins –

回答

1

听起来你好像很接近,这里的工作查询:

SELECT u.first_name, 
     u.last_name, 
     s.magazine_id, 
     ps.id 
    FROM users u 
    JOIN subscriptions s 
    ON u.id = s.user_id 
    LEFT JOIN premium_subscriptions ps 
    ON s.user_id = ps.user_id AND s.magazine_id = ps.magazine_id 

和一个SQL小提琴,如果你想发挥与它周围:http://sqlfiddle.com/#!9/e5e58/6

+0

非常彻底,与有用的小提琴。谢谢!不重要的小技巧是获取指定的用户,在最后添加一个where子句u.id = [id] – Oranjoose

1

当然,这是可能的,它被称为左连接。

SELECT * FROM users AS u 
    JOIN subscriptions AS s ON s.id=u.user_id 
    LEFT JOIN premium_subscriptions AS p 
     ON p.user_id=s.user_id AND p.magazine_id=s.magazine_id 

左连接将返回NULL的连接表的每一个查询列的情况下,没有匹配。

1

您可以用LEFT JOINCASE声明来完成。像下面的东西应该工作:

SELECT u.id, 
     u.first_name, 
     u.last_name, 
     s.magazine_id, 
     CASE 
     WHEN ps.id is null 
     THEN 'No' 
     ELSE 'Yes' 
     END as Premium_Subscriber 
FROM users u 
INNER JOIN subscriptions s 
ON u.id=s.user_id 
LEFT JOIN premium_subscriptions ps 
ON ps.id=u.id 
AND ps.user_id=s.user_id 
AND ps.magazine_id=s.magazine_id