SQL左外连接具有三个表

时间:2019-11-29 08:33:21

标签: mysql sql

我基本上是在开发电子商务应用程序。应用程序有两个页面(所有产品和我的购物篮),经过身份验证的用户可以将产品添加到自己的购物篮中。我有三个表,这些表包含以下数据。我想如果用户将产品添加到自己的购物篮中,那么这些用户的所有产品页面上都不存在这些产品。

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 产品。

3 个答案:

答案 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子句的计算结果为falseNULL时,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 
                 );

这似乎是对您问题的最直接的解释。