2016-01-04 38 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