2015-02-07 64 views
0

我有一个mysql查询,不能完全弄清楚如何从给定的country_id中提取某个product_id的所有潜在客户。我想要一个每个客户只有一个记录的结果。
我的表格是orderscustomers如何从mysql表中获取所有可能的订单

---customers-- 
customer_id 
country_id 
name 
---orders--- 
order_id 
product_id 
customer_id 

我目前的查询给出了太多的结果。从其他product_id的不在= 1。这里即记录是我的查询:

SELECT o.order_id 
    , c.name 
    , c.customer_id 
    , c.country_id 
    , o.product_id 
    FROM customers c 
    LEFT 
    JOIN orders o 
    ON o.customer_id = c.customer_id 
WHERE o.product_id = 1 
    OR c.country_id = 1 

一些样本的结果可能是这样的:

order_id name  customer_id country_id product_id 
1   Joe Smith 1   1   1 
2   Joe Smith 1   1   2 
3   John Doe 2   1   1 
4   Kirk Smith 3   1   1 
NULL  Ron Rhoden 6   1   1 
NULL  Sam Smith 7   1   1 

对于我而言,你可以假设给定的客户将只订购一次给定的产品。请注意我如何得到Joe Smith的结果product_id=2。我不希望那个结果在我的名单中。罗恩罗登和萨姆史密斯的成绩对我而言是可取的。如何过滤product_id<>1记录但仍包含所有country_id=1记录? 谢谢。

+0

基本上,这是一个循环的参数 - 你想国家ID = 1的行,但你没有。 – 2015-02-08 00:02:51

+0

不,我希望每个使用country_id = 1的人以及那些已经订购了product_id = 1的人也希望他们的order_id。 – Thread7 2015-02-08 00:04:42

+0

我总是发现左连接与地点...或真的令人困惑 – Strawberry 2015-02-08 00:07:01

回答

0

这是我的尝试:

SELECT o.order_id 
    , c.name 
    , c.customer_id 
    , c.country_id 
    , o.product_id 
FROM customers c 
    LEFT 
    JOIN orders o ON o.customer_id = c.customer_id 
WHERE o.order_id IN (SELECT order_id FROM orders WHERE product_id = 1) 
OR c.country_id IN (SELECT customers.country_id FROM customers WHERE product_id = 1) 
); 
+0

我想你的意思是最后一个prodct_id = 1来说country_id = 1。无论如何,我尝试过。它不起作用,因为我从订购product_id = 1以外的产品的客户那里获得记录。这仍然是最接近的。看到上面的内容,我正在回答我之前给出的答案。 – Thread7 2015-02-08 15:21:59

0

如果我理解正确,您希望来自国家“1”的订购产品“1”的所有客户。我会建议使用exists

select c.* 
from customers c 
where c.country_id = 1 and 
     exists (select 1 
       from orders o 
       where o.customer_id = c.customer_id and 
        o.product_id = 1 
      ); 
+0

好吧,我试过了,它只给了我两个记录。以上面的示例数据为例,我想收到5条记录。我希望每个人都使用country_code = 1,对于那些有product_id = 1的order_id的客户,我也希望看到他们的order_id。 – Thread7 2015-02-08 01:18:44

0

好吧,我想这样的作品。有点复杂,但我首先要求订单中的所有product_id = 1记录,然后做了UNION查询,然后询问country_id = 1但不在以前的product_id = 1结果中的客户。

SELECT o.order_id,c.name,c.customer_id,c.country_id,o.product_id
FROM客户下放置JOIN订单O于o.customer_id = c.customer_id WHERE o.product_id = 1 UNION SELECT NULL AS order_id,c.name,c.customer_id,c.country_id,NULL AS product_id
FROM customers c
WHERE c.country_id = 1 AND c.customer_id NOT IN(SELECT c2.customer_id FROM customers c2 INNER JOIN orders o2 ON c2.customer_id = o2.customer_id WHERE o2.product_id = 1)