2014-01-14 112 views
-6

我有一个订单在mysql表中包含一些产品的订单。在mysql中加入两个相关表

我有一个表也被涉及到订单表与验证ID

订单表结构:

id | name | AuthID 

1  |  Ali |  10 
2  | Reza |  11 

车表结构:

id | productID | AuthID 

1  |  P1  |  10 
2  |  P2  |  10 
3  |  P3  |  10 
4  |  P2  |  11 

我想加入订单随着,只是返回所有行订单表,这意味着该查询必须返回两行

简单的字表是一个购物车我只是想展现订单 +适用于产品的一些过滤器内部

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 
+0

返回4行(在车表中的所有行),而不是返回2行 –

+0

这听起来像一个问题,也许probem是在加入,可以我们看到造成这种情况的查询? – 2014-01-14 04:57:01

+0

@Mohammad Masoudian删除'*,'并选择你需要的2行。 – voodoo417

回答

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 
1
"select * from Orders left join Cart on Orders.AuthID=Cart.AuthID" 

然后我们得到两行 否则交换表,然后我们得到4行,但订单表项重复。 我们只能通过验证ID

连接这两个表
+0

第一个查询仍为我返回4行。 – rccoros

1

如果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 

注意,内嵌视图别名为q返回AUTHID的唯一列表,我们可以加入到订单表。这种方法避免了“复制”返回的行。


的等同的结果也可以与查询中使用相关子查询在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表也将工作列。我认为我提供的两个解决方案更好地说明了为什么您获得多行,以及我们可以使用一些方法来避免这种情况。