【问题标题】:How to get enum field value by its index in mysql如何通过其在mysql中的索引获取枚举字段值
【发布时间】:2020-06-03 04:52:33
【问题描述】:

我有一个带有枚举字段的表。我需要计算该字段的平均值并将其显示为枚举元素之一。

我得到的平均值是这样的:SELECT AVG(val) FROM test; 它工作正常。但随后我需要通过该索引获取枚举值之一。为了获得索引,我使用ROUND。但我不知道下一步该做什么。

有可能吗?

还有其他方法吗?

示例

创建表:

CREATE TABLE test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    val ENUM('bad', 'good', 'perfect')
);

填表:

INSERT INTO test(val) VALUES('bad'), ('bad'), ('good'), ('bad'), ('perfect'), ('perfect'), ('good');

选择要以某种方式修复的查询:

SELECT AVG(val) average_value_ind, ROUND(AVG(val)) closest_value_ind FROM test;

在本例中,平均值应为good

【问题讨论】:

  • 另一种方法?是的;不要使用 ENUM。
  • 这张表我不负责也不能改

标签: mysql enums


【解决方案1】:

虽然将ENUM 值转换为整数或字符串很容易,但反之则更难。您可以使用ELT 函数,但这需要枚举所有ENUM 值:

SELECT AVG(val) average_value_ind, 
       ELT(ROUND(AVG(val)), 'bad', 'good', 'perfect') closest_value_ind 
FROM test;

输出:

average_value_ind   closest_value_ind
1.8571428571428572  good

Demo on dbfiddle

【讨论】:

  • 你能以某种方式通过查询元数据生成列表吗?
  • @BoristheSpider 当然这是可能的(例如,您可以查询和解析 INFORMATION_SCHEMA.COLUMNS.COLUMN_TYPE)。
  • @BoristheSpider 请参阅stackoverflow.com/questions/2350052/… 了解一些可能的解决方案。理论上,您可以加入information_schema.COLUMNS 来获取信息,但在许多情况下,用户无权访问这些表格。
  • 在许多情况下,用户无权访问这些表 这是一种奇怪且不合理的限制……除了管理员的懒惰,他更容易拒绝访问完全授予 INFORMATION_SCHEMA 而不是仅将 SELECT 权限授予 INFORMATION_SCHEMA 这是几个视图,而不是表。
  • @Akina 我并不是说这不是没有道理的,或者管理员很懒惰,但这是我的经验......
【解决方案2】:

感谢大家的回答和cmets。你帮了我。

这是我设法做到的。它适用于我的情况。

SELECT 
    AVG(val) average_value, 
    ROUND(AVG(val)) closest_value_id, 
    JSON_UNQUOTE(JSON_EXTRACT(val_enum.items, CONCAT("$[", ROUND(AVG(val)) - 1, "]"))) enum_value
FROM test
CROSS JOIN (
    SELECT CAST(CONCAT('[', REPLACE(SUBSTRING(COLUMN_TYPE, 6, LENGTH(COLUMN_TYPE) - 6), "'", '"'), ']') AS JSON) items
    FROM information_schema.COLUMNS 
    WHERE TABLE_NAME = 'test' AND COLUMN_NAME = 'val'
) val_enum;

【讨论】:

  • 在子查询中也检查SCHEMA_NAME以避免在另一个数据库中存在列test的表val
  • 这很可怕,但同时又出奇地美丽...... :-)
  • @Nick 是的,我希望有更好的方法来做到这一点;)
猜你喜欢
  • 1970-01-01
  • 2011-09-06
  • 2023-03-09
  • 1970-01-01
  • 2011-09-05
  • 1970-01-01
  • 2011-10-05
  • 2021-07-25
  • 1970-01-01
相关资源
最近更新 更多