在mysql中连接两个相关的表

时间:2014-01-14 04:53:03

标签: mysql database join

我在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

我想加入订单 购物,只返回订单表中的所有行,这意味着查询必须返回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

3 个答案:

答案 0 :(得分:1)

"select * from Orders left join Cart on Orders.AuthID=Cart.AuthID"

然后我们得到两行 否则交换表,然后我们得到四行,但重复订单表项。 我们只能通过AuthID连接这两个表

答案 1 :(得分:1)

如果orders表中的authID是唯一的(如您的示例所示),并且您只想返回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

请注意,别名为q的内联视图会返回一个唯一的authID列表,我们可以将其连接到orders表。这种方法避免了“复制”返回的行。


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

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表格中的行的任何条件...例如c.color ='蓝'或其他。


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

答案 2 :(得分:0)

以下查询为我工作:

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