2012-09-03 29 views
1

我有,我把我所有的模板表:連接兩個表顯示已購買的物品

模板

  • template_id
  • TEMPLATE_NAME
  • template_price

這些模板可以由註冊用戶購買,然後購買重新插入payments表:

支付

  • payment_id
  • template_id
  • USER_ID

有沒有辦法參加這兩個表,並得到不只是一個列表由某個用戶購買的模板,但所有模板?然後從那裏算出哪些已經被購買?

我使用這個SELECT,但只有用戶購買的出現。我想從templates獲得所有行,但在user_id不匹配的情況下爲空。

SELECT * 
FROM templates 
LEFT JOIN payments 
ON templates.template_id = payments.template_id 
WHERE user_id = 2 
GROUP BY templates.template_id 
+0

難道你不是指'我想從付款中獲得所有的行,但是在user_id不匹配的情況下爲空'? – Zeemee

回答

1

使用子查詢,這將是

SELECT t.*, p.payment_id 
FROM templates t 
LEFT JOIN (
    SELECT * FROM payments WHERE user_id=2 
) p ON t.template_id = p.template_id 

這說明你所有的模板和payment_id,如果有一個針對該用戶。

0

試試這個:

SELECT * 
FROM templates 
LEFT JOIN payments 
ON templates.template_id = payments.template_id 
AND user_id = 2 -- <-- change Where to and 
GROUP BY templates.template_id 
+0

提示:您可以使用'template(template_id)'而不是'ON templates.template_id = payments.template_id' – diEcho

+0

@diEcho:謝謝你的支持。 –

1
SELECT t.*, IF(p.user_id IS NULL, 'not purchased', 'purchased ') AS is_purchased 
FROM templates t 
LEFT JOIN payments p 
ON t.template_id = p.template_id 
GROUP BY t.template_id 
+0

這不會選擇只有一個用戶付款 – Zeemee

0

試試這個:

SELECT templates.template_id, templates.template_name, templates.template_price, payments.user_id 
FROM templates 
LEFT JOIN payments 
ON templates.template_id = payments.template_id 

這將顯示所有的模板,但不給你一個獨特的名單。

0

試試這個使用UNION

SELECT b.template_name, 'purchased' `status` 
FROM payments a 
      INNER JOIN templates b 
       on a.template_id = b.templateID 
WHERE a.user = 2 
UNION 
SELECT template_name, 'not purchased' `status` 
FROM templates 
WHERE template_name NOT IN 
(
    SELECT b.template_name 
    FROM payments a 
       INNER JOIN templates b 
        on a.template_id = b.templateID 
    WHERE a.user = 2 
) 
相關問題