1

すべてのテンプレートを保持するテーブルがあります。

テンプレート

  • template_id
  • テンプレート名
  • template_price

これらのテンプレートは登録ユーザーが購入でき、paymentsテーブルに挿入されます。

支払い

  • payment_id
  • template_id
  • ユーザーID

これら 2 つのテーブルを結合して、特定のユーザーが購入したテンプレートのリストだけでなく、すべてのテンプレートを取得する方法はありますか? そして、そこからすでに購入されたものを見つけますか?

この 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.*, 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 に答える
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 に答える
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 に答える
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 に答える