【问题标题】:How to get the smallest number in a series of items, for each series?对于每个系列,如何获得一系列项目中的最小数字?
【发布时间】:2020-08-05 15:49:45
【问题描述】:

我的数据库中有两张表,一张包含项目,另一张包含票证。我想要每个项目的第一张票。 表项目有:

  • AAA
  • BBB
  • CCC

桌票有:

  • AAA-1
  • AAA-2
  • BBB-2
  • BBB-3
  • CCC-100
  • CCC-101

我想要的是每个项目中最小票证的列表,因此结果应该是 AAA-1、BBB-2、CCC-101。单独使用sql可以吗?我需要一个函数吗? 我一直在尝试使用 min 和 joins,但我无法正确混合它们......

谢谢

【问题讨论】:

  • 首先,您应该将CCC-101等值分隔在两列中:“CCC”(VARCHAR)和101(NUMERIC)。在数据库中执行此操作。那么查询就变得很简单了。
  • 这两个表有什么关系?票证表不应该有一列存储项目ID吗?
  • 这不是链接这两个实体的可取方式。 Project 应该是 Ticket 表上的外键。
  • 我把这样的信息更简单,但门票表门票分为varchar和数字。正如其他人所说,他们通过 ID 与项目相关。我不认为这些信息是相关的。将它放在两列中如何变得更简单(因为我已经在我的数据库中拥有它,所以我认为这很重要)

标签: mysql sql


【解决方案1】:

可能最简单的方法是:

select concat(substring_index(ticket, '-', 1), , '-',
              min(substring_index(ticket, '-', -1) + 0)
             ) as first_ticket
from t
group by substring_index(ticket, '-', 1)

这会在将min() 作为数字后重构值。

如果你不想重构值:

select (select t.ticket
        from tickets t
        where t.ticket like concat(p.project, '-%')
        order by length(ticket), ticket
        limit 1
       ) as first_ticket
from projects p;

这仅对最小值使用字符串操作,因此它假定没有零填充。也可以修改为使用数字:

        order by p.project, substring_index(ticket, '-', -1) + 0

【讨论】:

  • 谢谢!!第二个问题让我走上了正确的道路!
猜你喜欢
  • 2021-07-04
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-22
相关资源
最近更新 更多