我基本上是在开发电子商务应用程序。应用程序有两个页面(所有产品和我的购物篮),经过身份验证的用户可以将产品添加到自己的购物篮中。我有三个表,这些表包含以下数据。我想如果用户将产品添加到自己的购物篮中,那么这些用户的所有产品页面上都不存在这些产品。
SQL查询应该如何?我正在寻找所有产品页面的查询。因此查询的返回类型必须为Product。
如果用户将所有产品添加到所有产品页面上的自己的购物篮中 不应在该用户的所有产品页面上看到。
PRODUCT TABLE
+-------+--------+
| id | name |
+-------+--------+
| 1 | p1 |
| 2 | p2 |
+-------+--------+
USER TABLE
+-------+--------+
| id | name |
+-------+--------+
| 3 | U1 |
| 4 | U2 |
+-------+--------+
BASKET TABLE
+-------+---------+-------------+
| id | fk_user | fk_product |
+-------+---------+-------------+
| 5 | 3 | 1 |
| 6 | 4 | 2 |
+-------+---------+-------------+
因此,如果经过身份验证的用户的ID为 3 。用户应该在自己的所有产品页面上看到 p2 产品。
答案 0 :(得分:2)
尝试一下:
SELECT product.name
FROM product
LEFT JOIN basket ON basket.fk_product = product.id
WHERE (basket.fk_user != 3 OR basket.fk_user IS NULL)
检查我的demo query
如果您愿意,也可以加入user
表,但是不必使用您提供给我的数据。
当on子句的值为left join
时,true
将所有行保留在第一个(产品)表中,并将所有行保留在第二个(购物篮)表中。
当on子句的计算结果为false
或NULL
时,left join
仍将第一张表中的所有行保留为第二张表的NULL
值。
答案 1 :(得分:2)
或更常见的是...
SELECT p.name
FROM product p
LEFT JOIN basket b
on b.fk_product = p.id
AND b.fk_user = 3
WHERE b.fk_user is null
答案 2 :(得分:0)
您所描述的听起来像NOT EXISTS
:
SELECT p.name
FROM product p
WHERE NOT EXISTS (SELECT 1
FROM basket b
WHERE b.fk_product = f.id AND
b.fk_user = 3
);
这似乎是对您问题的最直接的解释。