5

在 Web 应用程序中,我需要<select>使用 MySQL 枚举的所有可能值填充 a。

当我执行以下任一操作时:

显示来自“ mycolumn   mytable”的列;
从 INFORMATION_SCHEMA.COLUMNS 中选择 COLUMN_TYPE
WHERE TABLE_NAME = 'mytable' AND COLUMN_NAME = 'mycolumn';
我总是以enum('valueA','valueB','valueC').

我知道我可以用 PHP 解析它,但它只能使用 SQL 来完成吗?我需要这样的东西:

+-----------------+
| 价值观 |
+-----------------+
| 值A |
| 值B |
| 价值C |
+-----------------+
4

3 回答 3

7

这是 Chris Komlenic 的MySQL 的 ENUM 数据类型邪恶的 8 个原因之一:

 4. 获取不同 ENUM 成员的列表很痛苦。

一个非常常见的需求是使用数据库中的可能值填充选择框或下拉列表。像这样:

选择颜色:

[ select box ]

如果这些值存储在名为“colors”的参考表中,您所需要的只是:SELECT * FROM colors...然后可以将其解析出来以动态生成下拉列表。您可以在参考表中添加或更改颜色,您的性感订单表格将自动更新。惊人的。

现在考虑邪恶的 ENUM:如何提取成员列表?您可以在表中的 ENUM 列中查询 DISTINCT 值,但这只会返回实际使用并存在于表中的值,而不一定是所有可能的值。您可以查询 INFORMATION_SCHEMA 并使用脚本语言将它们从查询结果中解析出来,但这不必要地复杂。事实上,我不知道有什么优雅的、纯粹的 SQL 方法来提取 ENUM 列的成员列表。

于 2013-06-13T14:43:07.200 回答
3

虽然我同意大多数时候不使用枚举,但可以在单个 SQL 语句中使用:-

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING(COLUMN_TYPE, 7, LENGTH(COLUMN_TYPE) - 8), "','", 1 + units.i + tens.i * 10) , "','", -1)
FROM INFORMATION_SCHEMA.COLUMNS
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 AS i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE TABLE_NAME = 'mytable' 
AND COLUMN_NAME = 'mycolumn'

这将适用于具有多达 100 个可能值的枚举

于 2013-06-13T16:00:31.020 回答
0

这是最简单的解决方案

$EnumColum = $mysqli->query(
  $link,
  "SELECT COLUMN_TYPE FROM INFORMATION_SCHEMA.COLUMNS
    WHERE TABLE_NAME = 'mrb_shipping_carriers' AND COLUMN_NAME = 'uspsServiceType'"
) or die("Error in " . ": " . __FILE__ . ": " . __LINE__);

$replace1 = preg_replace("/enum/", '',$EnumColum[0]['COLUMN_TYPE']);
$replace2 = preg_replace("/\(/", '',$replace1);
$replace3 = preg_replace("/\)/", '',$replace2);
$replace4 = preg_replace("/\'/", '',$replace3);
$newArray = explode(',',$replace4);
foreach($newArray as $value){
    echo $value . "\n<br>";
}
于 2014-04-15T22:36:00.940 回答