在mysql中连接两个相关表

在mysql中连接两个相关表,mysql,database,join,Mysql,Database,Join,我在mysql中有一个Orders表,其中包含一些产品的订单 我也有一个购物车表,它与订单表相关,带有AuthID 订单表结构: id | name | AuthID 1 | Ali | 10 2 | Reza | 11 id | productID | AuthID 1 | P1 | 10 2 | P2

我在mysql中有一个Orders表,其中包含一些产品的订单

我也有一个购物车表,它与订单表相关,带有AuthID

订单表结构:

id    |    name    |    AuthID

1     |     Ali    |      10
2     |    Reza    |      11
id    |    productID    |    AuthID

1     |        P1       |      10
2     |        P2       |      10
3     |        P3       |      10
4     |        P2       |      11
购物车表结构:

id    |    name    |    AuthID

1     |     Ali    |      10
2     |    Reza    |      11
id    |    productID    |    AuthID

1     |        P1       |      10
2     |        P2       |      10
3     |        P3       |      10
4     |        P2       |      11
我想将订单购物车合并,只返回订单表中的所有行,这意味着查询必须返回2行

简单地说,购物车表是购物车,我只想显示订单+对购物车内的产品应用一些过滤器

SELECT *, orders.id AS id, orders.name AS name FROM orders 
LEFT JOIN cart ON orders.authID = cart.authID
WHERE orders.id != '0'
ORDER BY orders.id DESC
然后我们有两排 否则,交换表,我们得到四行,但订单表项重复。
我们只能通过AuthID连接这两个表

如果AuthID在
orders
表中是唯一的(如您的示例所示),并且您只想返回
orders
表中的行,可以执行以下操作:

SELECT o.id
     , o.name
     , o.authID 
  FROM orders o
  JOIN ( SELECT c.authID
           FROM cart c
          WHERE 1=1
          GROUP
             BY c.authID
       ) q
   ON q.authID = o.authID
 WHERE o.id != '0'
 ORDER
    BY o.id DESC
SELECT o.id
     , o.name
     , o.authID 
  FROM orders o
 WHERE o.id != '0'
   AND EXISTS ( SELECT 1
                  FROM cart c
                 WHERE c.authID = o.authID
                   AND 1=1
              )
 ORDER BY o.id DESC
请注意,别名为q的内联视图返回一个唯一的authID列表,我们可以将其加入orders表。这种方法避免了“重复”返回的行


在EXISTS谓词中使用相关子查询的查询也可以获得等效结果,如下所示:

SELECT o.id
     , o.name
     , o.authID 
  FROM orders o
  JOIN ( SELECT c.authID
           FROM cart c
          WHERE 1=1
          GROUP
             BY c.authID
       ) q
   ON q.authID = o.authID
 WHERE o.id != '0'
 ORDER
    BY o.id DESC
SELECT o.id
     , o.name
     , o.authID 
  FROM orders o
 WHERE o.id != '0'
   AND EXISTS ( SELECT 1
                  FROM cart c
                 WHERE c.authID = o.authID
                   AND 1=1
              )
 ORDER BY o.id DESC
注意:1=1谓词是一个占位符,表示您希望在
cart
表中的行上应用的任何条件。。。e、 g.c.color='Blue'或其他颜色



还有人会注意到,添加一个适当的
GROUP BY
子句,或者添加
DISTINCT
关键字和一个只引用
orders
表中的列的select列表也会起作用。我认为我提供的两个解决方案更好地说明了为什么会有多行,以及我们可以使用的一些方法来避免这种情况。

以下查询对我有效:

SELECT *, orders.id AS id, orders.name AS name FROM orders 
LEFT JOIN cart ON orders.authID = cart.authID
WHERE orders.id != '0'
GROUP BY orders.authID

返回4行(Cart表中的所有行)而不是返回2行听起来确实有问题,可能问题出在连接中,我们可以看到导致该问题的查询吗?@Mohammad Masoudian remove
*,
然后选择您需要的2行。您可以在“我的问题”中看到查询,但这将实际返回4行,不是吗?因为您使用的AuthID将匹配购物车表中的4个项目。第一个查询仍然为我返回4行。