MySQL加入没有重复

Tyl*_*den 4 mysql join left-join

我有一个客户表和一个订单表.每个客户可以有很多订单.

我想从订单表中选择每个客户以及他们最早的订单号(重要的是我选择最早的订单号,而不是任何订单).我想列出客户是否有订单,如果客户有多个订单,我不希望两次包含客户.

我正在使用这个:

  SELECT *
    FROM customers
    LEFT JOIN orders
    ON customers.id = orders.customer_id 
    GROUP BY customers.id
Run Code Online (Sandbox Code Playgroud)

这给了我几乎我想要的东西,除了它会从表中选择它喜欢的任何订单ID.我需要能够排序,并选择最小的订单ID.

有什么想法吗?

我很确定它的东西正在盯着我的脸......

编辑:表格的结构按要求

  • 顾客:


    | ID | Name | Address            | Etc |
    ----------------------------------------
    | 1  | Joe  | 123 Fake Street    |     |
    | 2  | Mike | 1600 Fake Road     |     |
    | 3  | Bill | Red Square, Moscow |     |
    ----------------------------------------
    
    Run Code Online (Sandbox Code Playgroud)
  • 命令:


    | ID | Customer_ID | Date |
    ---------------------------
    | 1  | 1           |  ... |
    | 2  | 2           |  ... |
    | 3  | 2           |  ... |
    | 4  | 1           |  ... |
    ---------------------------
    
    Run Code Online (Sandbox Code Playgroud)

O. *_*nes 6

为每个客户创建一个具有最低数字订单ID的虚拟表(a/k/a子查询).

SELECT customer_id, min(order_id)
  FROM orders
 GROUP BY customer_id
Run Code Online (Sandbox Code Playgroud)

然后将该表与customer表连接,就像这样.

SELECT C.customer_id, firstorder.order_id
  FROM CUSTOMERS as C
  LEFT JOIN (
    SELECT customer_id, min(order_id)
      FROM orders
     GROUP BY customer_id
  ) AS firstorder ON c.customer_id = firstorder.customer_id
Run Code Online (Sandbox Code Playgroud)

  • 也考虑看看: HAVING MIN(order_id) = order_id (2认同)