MySQL查询 - 加入查询

问题描述:

不知道如何为2个表编写此连接。下面是一些示例数据来说明:MySQL查询 - 加入查询

orders 
----------------------- 
| order_id | customer | 
----------------------- 
    ABC12345 1 
    ABC12346 4 
    ABC12347 3 
    ABC12348 2 
    ABC12349 2 
    ABC12350 3 


customers 
----------------------------------- 
| id | name | email    | 
----------------------------------- 
    1 James [email protected] 
    2 Alice [email protected] 
    3 Jimbo [email protected] 
    4 Jim [email protected] 
    5 Lucy [email protected] 

我有一个order_id,我已经知道了。我们使用表格中的第一个:ABC12345。正如你所看到的,客户ID是1,所以这个命令是由James发出的。现在有时詹姆斯再次用不同的名字命令,但我们知道这是他的电子邮件地址。

那么,如果我知道他的订单号码(ABC12345)之一,那么如何根据他的电子邮件地址[email protected]检索James的所有订单?

编辑:不知道我是否强调这一点......詹姆斯已经订购了3次,使用相同的电子邮件地址,但詹姆斯,吉姆和Jimbo的名字。我需要使用[email protected]作为电子邮件地址。

SELECT o2.order_id 
    FROM orders o1 
     INNER JOIN customers c1 
      ON o1.customer = c1.id -- get the customer for the first order 
     INNER JOIN customers c2 
      ON c1.email = c2.email -- find all customers with same email 
     INNER JOIN orders o2 
      ON c2.id = o2.customer -- find all orders for those customers 
    WHERE o1.order_id = 'ABC12345' 
+0

好的乔,比我的版本更干净,但我想知道两者之间的性能差异:) – DRapp

+0

我认为只需一次连接就足够了。 –

您可以使用此:

SELECT order_id 
FROM orders 
WHERE customer IN (
    SELECT id 
    FROM customers 
    WHERE email = (SELECT c.email FROM customers c JOIN orders o ON c.id = o.customer WHERE o.order_id = 'ABC12345') 
    ) 
+0

该OP问一个问题如何检索这个数据“_如果我知道他的一个订单号(ABC12345)_”。你的回答根本没有帮助。 – Tadeck

+0

已更新的答案。 –

试试这个,因为詹姆斯只有一个为了

SELECT orders.order_id, customers.name, customers.email 
FROM orders 
INNER JOIN customers ON customers.id = orders.customer 
WHERE orders.orer_id = 'ABC12345' 

订单ID是一个唯一的号码,那么你不会有两个命令使用相同的ID ,为什么关心客户的名字? “每个订单都会有一个客户ID。”

+0

詹姆斯真的有3个订单,其他时间他只是使用了吉姆和吉博的名字,所以我也需要这些订单。 – BadHorsie

+0

@Fernando Costa我提供了所有必要的信息。我认为你误解了这个问题。我不知道客户的电子邮件地址,我只知道他们的订单号码。数据并不重要,只是一个例子。 – BadHorsie

+0

但它不够清楚。 – B4NZ41

SELECT ORDER_ID 从接单 如果客户IN(SELECT客户 从接单 WHERE ORDER_ID = 'ABC12345')

+0

我需要查询才能根据电子邮件地址获取所有客户的订单。 – BadHorsie

您需要订单的人第一次量化到客户表..然后,通过同一封电子邮件获取所有客户ID ...然后获取符合这些客户ID的订单。

select o2.* 
    from orders o2 
     JOIN (select c2.ID 
       from customers c2 
       join (select c1.email 
          from orders o 
           join customers c1 
           on o.Customer = c1.ID 
          where 
           o.order_id = 'ABC12345') FoundTheEmail 
        on c2.email = FoundTheEmail.email 
      ) as SameCustomerEMail 
     on o2.Customer = SameCustomerEMail.ID