2016-03-01 36 views
0

我下面的查詢:如何排除有相同ID的所有行,如果一列不爲空

select oh.id_order,pc.id_product_comment,od.product_id 
from `ps_order_history` oh 
INNER JOIN `ps_orders` o ON o.id_order = oh.id_order 
INNER JOIN `ps_order_detail` od ON od.id_order = oh.id_order 
LEFT JOIN `ps_product_comment` pc ON pc.`id_customer` = o.`id_customer` AND pc.`id_product` = od.`product_id` 
where oh.`id_order_state` = 2 
AND (oh.date_add < pc.date_add OR pc.date_add IS NULL) 

返回以下結果:

id_order | id_product_comment | product_id 
---------------------------------------------- 
    6    3     6 
    6    NULL    5 
    5    NULL    6 
    5    NULL    5 

我想與id_order排除行6,因爲一個行有一個id_product_comment不爲null。 任何想法?

+1

你的意思是你想排除id_order 5,因爲它在id_product_comment中都有NULL值嗎? – Chendur

+0

對不起,我想排除id_order 6,我找到了解決方案 – prestarocket

回答

0

ok瞭解決方案:使用子查詢

select oh.id_order,pc.id_product_comment,od.product_id 
from `ps_order_history` oh 
INNER JOIN `ps_orders` o ON o.id_order = oh.id_order 
INNER JOIN `ps_order_detail` od ON od.id_order = oh.id_order 
LEFT JOIN `ps_product_comment` pc ON pc.`id_customer` = o.`id_customer` AND pc.`id_product` = od.`product_id` 
where oh.`id_order_state` = 2 
AND (oh.date_add < pc.date_add OR pc.date_add IS NULL) 
GROUP BY oh.id_order 
HAVING pc.id_product_comment IS NULL 
+0

這似乎不是一個可以持續工作的解決方案。您GROUP BY oh.id_order,因此每個id_order只會返回1行。在您的示例數據中,您只需返回2行中的1即可獲得5的id_order;哪個product_id將在該行中未定義。再進一步檢查_HAVING pc.id_product_comment IS NULL_,但是您無法控制返回pc.id_product_comment的哪些行以檢查是否爲空,因此您可能會或可能不會獲取排除的6個id_order。 – Kickstart

0

解。子查詢將獲得ps_product_comment上包含任何條目的id_order列表。這是左連接到主查詢,然後WHERE子句檢查沒有匹配的記錄。

SELECT oh.id_order, 
     pc.id_product_comment, 
     od.product_id 
FROM `ps_order_history` oh 
INNER JOIN `ps_orders` o ON o.id_order = oh.id_order 
INNER JOIN `ps_order_detail` od ON od.id_order = oh.id_order 
LEFT OUTER JOIN `ps_product_comment` pc ON pc.`id_customer` = o.`id_customer` AND pc.`id_product` = od.`product_id` 
LEFT OUTER JOIN 
(
    SELECT o.id_order 
    FROM ps_orders` o 
    INNER JOIN `ps_order_detail` od ON od.id_order = o.id_order 
    INNER JOIN `ps_product_comment` pc ON pc.`id_customer` = o.`id_customer` AND pc.`id_product` = od.`product_id` 
) sub0 
ON sub0.id_order = oh.id_order 
WHERE oh.`id_order_state` = 2 
AND (oh.date_add < pc.date_add 
OR pc.date_add IS NULL) 
AND sub0.id_order IS NULL 
相關問題