1

我有一张桌子,用来保存我的所有模板:

模板

  • 模板编号
  • 模板名称
  • 模板价格

这些模板可以由注册用户购买,然后插入到payments表中:

付款

  • 付款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
4

5 回答 5

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
于 2012-09-03T09:40:17.127 回答
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(如果该用户有一个)。

于 2012-09-03T09:43:30.597 回答
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
于 2012-09-03T09:38:27.050 回答
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

这将显示所有模板,但不会为您提供唯一列表。

于 2012-09-03T09:43:20.593 回答
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
)
于 2012-09-03T09:43:27.670 回答