MySQL在多个左连接行上
问题描述:
我有一个MySQL左连接查询,它返回表A中的1行和表B中的多行。我需要在这些行上有多个WHERE子句,并且只在所有B行比赛。MySQL在多个左连接行上
我:
SELECT
mage_sales_order.entity_id
FROM mage_sales_order
LEFT JOIN mage_sales_order_item
ON mage_sales_order.entity_id = mage_sales_order_item.order_id
WHERE
mage_sales_order_item.sku NOT LIKE '1-%'
AND mage_sales_order_item.sku LIKE '2-%'
## Group order IDs together
GROUP BY entity_id
然而,这将返回具有与SKU开始,“2 - ”即使它有开头“1”的项目一个项目的任何命令。我想要它只会返回以“2-”开头的项目的订单。
例如:
应返回:
- 订单1(mage_sales_order)
- 2- sampleA-SKU(mage_sales_order_item)
- 2- sampleB-SKU(mage_sales_order_item)
不应返回:
- 订单1(mage_sales_order)
- 1-样品SKU(mage_sales_order_item)
- 2- sampleA-SKU(mage_sales_order_item)
- 2- sampleB- SKU(mage_sales_order_item)
我如这已经被问到,但试图寻找它证明是困难的。
答
您可以添加另一个子查询,以排除那些行,如:
SELECT mage_sales_order.entity_id
FROM mage_sales_order
LEFT JOIN mage_sales_order_item
ON mage_sales_order.entity_id = mage_sales_order_item.order_id
WHERE mage_sales_order_item.sku LIKE '2-%'
AND mage_sales_order_item.order_id NOT IN (
SELECT order_id FROM mage_sales_order_item WHERE sku LIKE '1-%'
)
GROUP BY entity_id;
答
我认为你需要的WHERE
子句中移动逻辑到HAVING
条款:
SELECT
t1.entity_id
FROM mage_sales_order t1
LEFT JOIN mage_sales_order_item t2
ON t1.entity_id = t2.order_id
GROUP BY
t1.entity_id
HAVING
SUM(CASE WHEN t2.sku NOT LIKE '2-%' THEN 1 ELSE 0 END) = 0;
逻辑您当前的WHERE
子句的问题在于,此逻辑适用于单个记录。如果说SKU应该以2-
开头,并且不以1-
开头,因为前者的条件已经保证了后者。但是,在对实体进行聚合的情况下,逻辑确实似乎是有道理的。
答
你可以简单地移动从WHERE
条款的条件为JOIN
:
SELECT mage_sales_order.entity_id
FROM mage_sales_order
LEFT JOIN mage_sales_order_item
ON
mage_sales_order.entity_id = mage_sales_order_item.order_id
AND mage_sales_order_item.sku NOT LIKE '1-%'
AND mage_sales_order_item.sku LIKE '2-%'
WHERE mage_sales_order_item.order_id IS NOT NULL
GROUP BY entity_id
+0
如果SKU以'2-'开始,那么根据定义它不能以'1-'开头,所以至少你可以删除你的一个加入条件。 –
为什么'和'前'mage_sales_order_item.sku NOT LIKE '1%''? –
@KaushikNP因为我简化了这个问题的SQL,并忘记删除它(现在编辑)! –