1

我正在为 MySQL 查询中的 JOIN 苦苦挣扎。不知何故,我无法找出为什么我的结果不是我想要的。

我有两张桌子,一张桌子订单和一张桌子产品。表产品包含订单的 order.id。所以一个订单可以有多个产品,例如表 products 包含两个订单记录。

我需要的结果是产品的增值税为 21 的所有订单。

表示例。

orders
id | customer
---------------
1  | John Doe
2  | Hello World

order_products
id | order_id | product          | vat
1  | 1        | Porsche 911 GT4  | 21
2  | 1        | Audi R8 LMS      | 21
3  | 1        | Ferrari Enzo     | 19
3  | 2        | Bugatti Veyron   | 19

不,我想要所有产品增值税为 21 的订单。所以我将在 order_products 表上执行 LEFT JOIN:

SELECT orders.id, orders.customer, order_products.product FROM orders LEFT JOIN order_products ON orders.id = order_products.order_id WHERE order_products.vat = '21'

这将返回以下内容:

1 John Doe Porsche
1 John Doe Audi R8 LMS

但我只需要一个结果,因为 orders.id 对我很重要,而不是订单中的所有产品。我只加入 order_products 以获得仅含增值税 21 的订单。目前我没有解决此问题的选项。即使在阅读了有关此站点和其他站点上的加入的几个主题之后。

4

3 回答 3

3

首先,您不会退回任何没有产品的订单,因此不需要左连接……内连接就可以了。

如果orders_product 对您不重要,您可以使用子查询而不从orders_product 中选择任何列。但是,使用当前查询,您正在选择一列。

就像是...

SELECT id, customer 
FROM orders 
WHERE order_id IN (SELECT order_id FROM order_products
                   WHERE order_products.vat = '21');

如果您不想使用相关子查询,您可以使用 group by 或 distinct

SELECT orders.id, orders.customer 
FROM orders 
INNER JOIN order_products ON orders.id = order_products.order_id 
WHERE order_products.vat = '21'
GROUP BY orders.id, orders.customer;

或者...

SELECT DISTINCT orders.id, orders.customer 
FROM orders 
INNER JOIN order_products ON orders.id = order_products.order_id 
WHERE order_products.vat = '21';
于 2013-10-04T10:33:39.247 回答
2

如果您只关心订单,则可以按订单 ID 分组:

SELECT orders.id, orders.customer, order_products.product 
FROM orders 
LEFT JOIN order_products ON orders.id = order_products.order_id 
WHERE order_products.vat = '21'
GROUP BY orders.id;

但是请注意,这order_products.product只是其中一种产品。如果您希望显示所有产品,但在一列中,您可以使用GROUP_CONCAT

SELECT orders.id, orders.customer, GROUP_CONCAT(order_products.product) 
FROM orders 
LEFT JOIN order_products ON orders.id = order_products.order_id 
WHERE order_products.vat = '21'
GROUP BY orders.id;

这将返回:

1 John Doe Porsche, Audi R8 LMS
于 2013-10-04T10:35:56.477 回答
0
SELECT DISTINCT o.id
              , o.customer
           FROM orders o
           JOIN order_products op
             ON op.order_id = o.id 
          WHERE op.vat = 21;
于 2013-10-04T11:19:57.253 回答