MySQL - 从第二个表中选择与第一个表匹配的最后一个记录

Aly*_*yas 16 mysql join multiple-tables

我有两个表客户和订单,下面是结构.

表 - 客户

  • ID
  • 顾客姓名

表 - 订单

  • ID
  • ORDER_ID
  • 顾客ID

客户表有客户记录和订单表有客户下订单,

orders表中的customer_id链接到customers表的id字段.

现在一个客户可以拥有零个或一个或多个订单,我想只获得客户的最后订单.

当我运行以下查询一个简单的隐形连接时,它返回客户的所有订单

SELECT customers.customer_name,orders.order_id FROM orders,customers WHERE orders.customer_id=customers.id
Run Code Online (Sandbox Code Playgroud)

我也尝试了不同的JOIN语句,但无法获得客户的最后一个订单,我希望在一个SQL查询中为所有客户提供它.

预先感谢您的帮助.

小智 23

在MySQL中,只有几种方法可以使它工作(我现在实际上).第一个是你的排序表作为descjoin:

SELECT c.customer_name, o.customer_id, o.order_id,o.id FROM customers c 
INNER JOIN orders o 
    ON o.id = (SELECT id FROM orders WHERE customer_id = c.id ORDER BY id DESC LIMIT 1)
Run Code Online (Sandbox Code Playgroud)

实时使用是完成它的唯一方法,但如果你需要实时加入一些,你可以创建一个临时表或别名表来对其进行排序以进行选择,如下所示:

CREATE TABLE tmp_your_table AS 
SELECT * FROM orders ORDER BY id DESC
Run Code Online (Sandbox Code Playgroud)

所以现在你可以使这个加入工作:

SELECT c.customer_name, o.customer_id, o.order_id,o.id FROM customers c 
INNER JOIN tmp_your_table o ON o.id = tmp_your_table.id
Run Code Online (Sandbox Code Playgroud)


Meh*_*zad 13

试试这个查询

SELECT 
   c.customer_name, 
   max(o.order_id)
FROM 
   customers c
INNER JOIN
   orders o
ON
   o.customer_id = c.id
GROUP BY 
   c.customer_name
Run Code Online (Sandbox Code Playgroud)

订单表中没有任何日期字段,因此假设最新订单是具有的max(order_id).

  • 我用以下方法解决了这个问题; `SELECT c.customer_name,o.customer_id,o.order_id,o.id FROM customers c INNER JOIN orders o ON o.id =(SELECT id FROM orders WHERE customer_id = c.id ORDER BY id DESC LIMIT 1) (6认同)