【问题标题】:Return string of minimum length in MySQL database返回 MySQL 数据库中最小长度的字符串
【发布时间】:2019-08-28 15:55:38
【问题描述】:

我有一个名为“Inventory”的表,其中包含 Item (varchar)、Amount (int)、Type (varchar) 字段

我要提取的是具有以下字段的行:

所有类型类型项目的项目字段中的最短条目

类型类型所有项目的所有金额的总和

我有以下:

SELECT Item, sum( Amount ) FROM Inventory GROUP BY Type

它给出了我想要的,除了它不返回最短的项目,而是它具有其他项目之一(我认为它找到的最后一个)。最短的意思是最小的字符串长度。

感谢您的帮助。

【问题讨论】:

  • 在 MySQL 中,选择不在 GROUP BY 列表中的列的行为是未定义的。 MySQL 可以为该列返回任何匹配行的值。
  • 一个包含测试数据和预期输出的更具体的问题会大有帮助。

标签: mysql string


【解决方案1】:

可以通过子查询获取。

select type, sum(amount), item 
from inventory 
group by type
having length(item) <= (select min(length(item)) from inventory)

用户Order By columnName ASC /DESC进行排序 和LIMIT 1 从中得到一个

【讨论】:

  • 需要注意的是,如果多个项目具有相同的最短长度,则不确定将返回哪些相同长度的项目。
  • 我不认为总和会给你这里的期望值。总和将仅是长度与最小长度完全相同的所有项目。 Girish Rao 下面的最新答案也会给你正确的总和。
【解决方案2】:

select type, sum(amount), min(length(item)) from inventory group by type

应该做你想做的事

【讨论】:

  • 不,我已经想到了。该查询返回最小长度 Item 字符串的长度,而不是 Item 字符串本身。
  • 对不起。试一试select e.type, max_b.s, e.item from inventory e inner join (select e2.type, sum(e2.amount) as s, e2.item, min(length(e2.item)) as bb from inventory e2 group by e2.type) max_b on (length(e.item)=max_b.bb) group by e.type;
  • 我的答案在上面的评论中。那是合适的地方吗?还是我应该创建一个新的答案并将其放在那里?
【解决方案3】:

不确定这应该去哪里,所以我正在创建一个新答案:

select e.type, min_item.s, e.item from inventory e 
  inner join 
    (select e2.type, sum(e2.amount) as s, e2.item, min(length(e2.item)) as bb 
     from inventory e2 group by e2.type) min_item 
  on (length(e.item)=min_item.bb) 
group by e.type;

我对此进行了测试,它确实有效。

【讨论】:

  • 您应该改为编辑第一个答案。尝试删除您的第一个答案,因为那个答案不正确。否则,您将为此投反对票。这是问题的正确答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-04
  • 1970-01-01
  • 2019-04-18
  • 2013-05-02
  • 2020-08-22
  • 2012-06-15
相关资源
最近更新 更多