MySQL在多个左连接行上

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)

我如这已经被问到,但试图寻找它证明是困难的。

+0

为什么'和'前'mage_sales_order_item.sku NOT LIKE '1%''? –

+1

@KaushikNP因为我简化了这个问题的SQL,并忘记删除它(现在编辑)! –

您可以添加另一个子查询,以排除那些行,如:

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-'开头,所以至少你可以删除你的一个加入条件。 –