【问题标题】:Generating reports from MySQL tables从 MySQL 表生成报告
【发布时间】:2010-10-15 20:23:38
【问题描述】:

假设您有一堆 MySQL 表,并且您希望最终用户能够使用 PHP 脚本生成包含这些数据的报告。您可以在下拉列表中显示这些表中的字段名称,因此用户可能会说“first_name 等于 John”。伟大的。但是,如果您希望这些字段名称更具可读性怎么办?例如,我希望用户能够选择“第一只宠物的名字”作为字段,而不是“first_pet_name”。我绝对不想将这些信息存储在标记中,因为我们可能会非常频繁地添加和删除表。最简单的方法是什么?

【问题讨论】:

    标签: php mysql database-design reporting


    【解决方案1】:

    我会做一些简单的事情,比如用空格替换下划线,并将第一个字母大写。

    【讨论】:

    • 我认为他的意思是在将下划线显示给用户之前用空格动态替换它们。实际上,在名称中添加空格出现在我后来的回答中,以及来自 Bill Karwin 的回答中,但我不能说我真的会推荐这个解决方案。
    • 这很棒,除了我希望能够指定可搜索的字段(防止下拉菜单陷入不必要的字段)。拥有另一个详细说明“人类标签”的表格可以让我这样做并解决我原来的问题。
    【解决方案2】:

    您可以创建一个表格,将文本信息绑定到表格+列对。假设您有一个表 users,并且您想显示列名“第一宠物的名字”而不是 first_name。

    假设(表名ColumnTextInformations):

    ParentTable | ParentColumn | Text
          users |   first_name | Name of First Pet
    ...
    

    因此,您的列标签具有唯一标识符。

    使用起来非常简单:

    SELECT Text 
    FROM ColumnTextInformations
    WHERE parentTable = ? AND parentColumn = ?
    

    【讨论】:

      【解决方案3】:

      我会把它存储在数据库中。

      CREATE TABLE human_labels (
          schema  varchar(64) not null,
          table   varchar(64) not null,
          column  varchar(64) not null,
          label   tinytext    not null,
          primary key (schema, table, column)
      );
      

      其中 schema 是你在 mysql 中通常所说的“数据库”(当你切换数据库时,USE 之后的内容);并且表格和列非常明显。

      当然,您必须确保 DBA 在更改架构时进行更新。

      我相信 MySQL 允许对表进行评论,但不允许对列进行评论,或者您可以使用它。

      编辑:将 varchar 更改为 64,因为这是 MySQL 手册记录的最大大小。此外,事实证明,如果您愿意,您可以在每一列上添加评论——您可以从 information_schema.columns 中读回这些评论。但是我仍然会按照上面显示的方式进行操作,因为它更灵活(您可以轻松地将其他数据放入其中,例如您的“我应该显示此字段”标志)并且还允许将 cmets 用于其预期目的。

      【讨论】:

      • 我认为这是最好的方法。元数据将允许您创建更灵活和可扩展的报告。您可以存储一些其他信息,这些信息可以让您的用户获得更好和有用的报告
      【解决方案4】:

      最简单的解决方案是使用分隔标识符。这允许您拼写包含空格、标点符号和特殊字符、SQL 关键字等的表名和列名。

      您必须在 SQL 查询中分隔表名和列名(包括用于定义它们的 CREATE TABLE 语句)。

      CREATE TABLE `User Facts` (
        `User Name`         VARCHAR(100)
        ...
        `Name of First Pet` VARCHAR(100)
        ...
      );
      
      SELECT `Name of First Pet`
      FROM `User Facts`
      WHERE `User Name` = 'Bill';
      

      默认情况下,MySQL 使用反引号(如上所示)作为分隔标识符。

      有关详细信息,请参阅“Do different databases use different name quote”。

      【讨论】:

      • D'oh,你打败了我的反引号想法。好样的。
      • 这就是疯狂。还有来自每个 DBA 和程序员的 LART,他们必须为他们的所有查询输入这些名称(引用和所有)。如果您这样做,请使用视图来创建这些名称!
      • @derobert:您从未见过用国际字符拼写的 SQL 标识符?
      • @Bill Karwin:实际上,不,我没有。但即便如此,这与使用名称不同,只要它们对任意最终用户都是显而易见的。更不用说当有人决定“请将该标签更改为 First Pet's Name。这样会更清楚”时的乐趣。标签改变;列名不应该。
      • @derobert:好的,很公平。是的,使用列名作为标签充满了危险。而使用分隔标识符有许多合法用途。
      【解决方案5】:

      我并不是说这是一个好主意,但从技术上讲——从技术上讲——如果你在整个代码中用反引号包围这些标识符,MySQL 将允许你创建包含空格的表和列。例如:

      mysql> create table `This is a Table` (`First Name` varchar(50),
          `Name of First Pet` varchar(20));
      Query OK, 0 rows affected (0.06 sec)
      
      mysql> insert into `This is a Table` values ('Tom', 'Skippy');
      Query OK, 1 row affected (0.01 sec)
      
      mysql> select * from `This is a Table`;
      +------------+-------------------+
      | First Name | Name of First Pet |
      +------------+-------------------+
      | Tom        | Skippy            |
      +------------+-------------------+
      1 row in set (0.00 sec)
      

      【讨论】:

        【解决方案6】:

        听说过列别名吗?

        选择 宠物ASName of First Pet, 用户名 AS Name of User 来自用户 WHERE user = 'Bill';

        【讨论】:

          猜你喜欢
          • 2014-04-16
          • 2013-07-23
          • 2012-06-27
          • 2013-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多