【问题标题】:MySQL Select only latest row [duplicate]MySQL仅选择最新行[重复]
【发布时间】:2021-10-30 11:17:57
【问题描述】:

我有一个表跟踪,其中包含

id name trackingNumber
1 John Doe 1Z21343V43DF4434
2 John Doe 1Z21343V43DF4435
3 Jane Smith 1Z21343V43DF4436
4 Mark Jacobs 1Z21343V43DF4436
5 Mark Jacobs 1Z21343V43DF4437
6 Mark Jacobs 1Z21343V43DF4438

还有一个包含订单的表

id OrderNumber Name
1 12-12324232 John Doe
2 12-12324234 Mark Jacobs
3 12-12324236 Michael Smith

当我运行查询时

select * from tracking t
join orders o
on (t.name = o.name OR o.name = t.name)

我为 John Doe 和 Mark Jacobs 获得了多个结果,因为他们都有多件装运。我不能做一个限制,因为在现实世界中会有超过 100 个未发货的订单和 100 个跟踪号。

我希望能够仅获得最新的跟踪号,这样订单就不会被所有跟踪号多次更新,因为一个跟踪号会显示所有跟踪号。

当前查询的 SQL Fiddle - http://www.sqlfiddle.com/#!9/569d4a/1/0 我只想要每个名称的最新跟踪号。

【问题讨论】:

  • 你怎么知道哪一个是最新的?按日期?如果是,表tracking 应该有一个日期列,但看看你的例子,它没有。
  • @FaNo_FN 是的,有一个日期列
  • 太棒了!您能否更新您的问题并在相关表格中包含日期列?另外,请在您的问题中说明预期结果。谢谢
  • @FaNo_FN 它并没有真正改变任何东西。跟踪表有一个 created 日期时间,而 orders 表有一个paid_time 日期时间。我检查 created >=paid_time 以确保在下订单后创建跟踪。
  • 请问您,每个订单号是否只有一个跟踪号或更多?并且假设tracking number是在付款后才创建的,那么如何将order table 与tracking table 联系起来呢?

标签: php mysql laravel join inner-join


【解决方案1】:

如果我正确理解您的问题,您只想要第一个表中的第一个结果吗?您可以搜索 min(id) 以接收 ID 为 1 的记录,如 here 所述。但是同样可以通过按 ID DESC 排序然后限制为 1 来实现。

如果您的条件应该适用于您加入的表,这实际上可能就是您想要的。另外附带说明一下,您的连接条件似乎是多余的,如果 t.name = o.name,为什么 o.name 不等于 t.name?

您只想要基于什么顺序的第一个结果?我建议先排序。另外,如果您的意思是这样,您只能提取 trackingNumber:

SELECT trackingNumber from tracking t
join orders o
on (t.name = o.name OR o.name = t.name)

更新 1

我相信我理解您的问题,但是为您提供仅基于查询的答案超出了我的 sql 能力。我可以建议使用一些代码来解决这个问题吗?这是我的做法:

  1. 运行查询以获取所有用户(从跟踪中选择名称)

  2. 然后获取该用户的最新发货

    SELECT id FROM orders WHERE name = {name} ORDER BY id DESC LIMIT 1

如果必须仅使用 sql 完成,您也可以使用查询序列来解决此问题,但是正如 here 演示的那样,这非常复杂。

【讨论】:

  • 我更好地更新了问题的解释。请看一下。
  • @rbur0425 我添加了更多信息。如果这不是您在搜索中寻找的 gl。
【解决方案2】:

您只想要基于什么顺序的第一个结果?我建议先排序。另外,如果您的意思是这样,您只能提取 trackingNumber:

SELECT trackingNumber from tracking t
join orders o
on (t.name = o.name OR o.name = t.name)

【讨论】:

  • 我在问题中添加了更多细节,请看一下
  • 对于订单,它是 min(id),因为这将是主跟踪号
猜你喜欢
  • 2014-03-10
  • 1970-01-01
  • 2020-06-27
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-01
相关资源
最近更新 更多