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