我有两张桌子,如图所示:

cat_id | cat_name
1      | free
2      | semi-paid
3      | premium

payment_id | user_id | cat_id
1          | 1       | 1
2          | 1       | 4

我想查询如下结果
payment_id | user_id | cat_name
1          | 1       | free
null       | 1       | semi-paid
null       | 1       | premium
2          | 1       | null

如果付款id为空,我将在配置文件页的用户界面中不显示付款图标。这意味着用户id=1没有使用任何来自半付费和付费类别的内容。
我试过了
SELECT payment_id, user_id, cat_name
FROM payment
FULL JOIN category
  ON payment.cat_id
WHERE user_id = 1

但是我有一张笛卡尔桌子:(你能帮我吗?

最佳答案

SQL DEMO

SELECT c.*, p.*, payment_id, user_id, cat_name
FROM category c
LEFT JOIN payment p
  ON c.cat_id = p.cat_id
 AND p.user_id = 1
UNION
SELECT c.*, p.*, payment_id, user_id, cat_name
FROM category c
RIGHT JOIN payment p
  ON c.cat_id = p.cat_id
 AND p.user_id = 1

输出集中在最后3列
| cat_id |  cat_name | payment_id | user_id | cat_id | payment_id | user_id |  cat_name |
|--------|-----------|------------|---------|--------|------------|---------|-----------|
| (null) |    (null) |          2 |       1 |      4 |          2 |       1 |    (null) |
|      1 |      free |          1 |       1 |      1 |          1 |       1 |      free |
|      2 | semi-paid |     (null) |  (null) | (null) |     (null) |  (null) | semi-paid |
|      3 |   premium |     (null) |  (null) | (null) |     (null) |  (null) |   premium |

关于sql - 完全外部联接或右外部联接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47835250/

10-10 02:30