【问题标题】:How to select Unknown Number of Columns in mysql?如何在mysql中选择未知的列数?
【发布时间】:2015-11-12 18:59:07
【问题描述】:

鉴于某些列的表和名称,我有以下信息架构选择查询。

SELECT `COLUMN_NAME`
                FROM `INFORMATION_SCHEMA`.`COLUMNS`
                    WHERE `TABLE_SCHEMA` = 'm_college'
                    AND `TABLE_NAME` = 'm_fee'
                    AND COLUMN_NAME NOT IN ('id', 'classid', 'semid')

但是这个选择并没有给我选择的每个未知列的行值。我得到的只是未知列的名称。是否可以选择行的值,以便我可以在我的 php 脚本中将列作为键和行作为值对?我需要在其他表中插入列名和行值。请提供帮助或建议。

【问题讨论】:

  • 为什么不使用 select *
  • 因为我想要动态列。
  • INFORMATION_SCHEME 只保存元数据,即关于数据的数据。 MYSQL 使用它来记录和了解此 MYSQL Server 实例中存在哪些模式/数据库/表/字段/字段类型/索引等。它不保存您存储在数据库中的实际数据。
  • @RiggsFolly,感谢您提供的信息。那么您能否建议任何其他方法来提取未知列
  • 您的表是否有可能高度反规范化,例如动态创建列?每日数据

标签: php mysql select where-clause information-schema


【解决方案1】:

下面是显示相交表的快速尝试。

这使您可以拥有固定的结构并动态添加费用类型。

CREATE TABLE IF NOT EXISTS `mz_fee222` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `classid` int(11) NOT NULL,
  `semid` int(11) NOT NULL,
  `batch` year(4) NOT NULL,
  `session` int(11) NOT NULL
);

create table fee_type
(   fee_id int auto_increment primary key,
    description varchar(100)
);
insert fee_type (description) values ('exam'),('marksheet'),('admitcard'),('centre'),('practical'); -- etc as you go

create table mz_fee_intersect
(   -- here is where the fee amount is stored. Flexible.
    id int auto_increment primary key,
    mz_id int not null, -- this is the id from my_fee222 table
    fee_id int not null, -- this is the fee_id from fee_type table
    fee int not null, -- here is the actual fee, like 100 bucks
    -- FK's below (not shown):

    -- 
    unique key (mz_id,fee_id) -- forbids duplicates
);

【讨论】:

    【解决方案2】:

    好吧,我想不出为什么你有一个动态添加列的表,但这是一个我希望对您有所帮助的建议

    如果您运行DESCRIBE tablename 并收集结果,您将获得类似这样的结果集。

    Field       Type                Null    Key    Default  Extra
    
    id          int(10) unsigned    NO      PRI    NULL     auto_increment
    parent_id   int(11)             NO      MUL    0    
    lft         int(11)             NO      MUL    0    
    rgt         int(11)             NO             0    
    level       int(10) unsigned    NO             NULL 
    name        varchar(50)         NO      UNI    NULL 
    title       varchar(100)        NO             NULL 
    rules       varchar(5120)       NO             NULL 
    

    如果你把它加载到一个数组中,然后在后面的查询中删除你不想选择的行,你会得到它们的列名(在字段列中),如果你想要的话,甚至可以得到它们的数据类型。

    然后您可以使用此数组为您的特定列查询构建字段列表,并且您还知道在处理任何结果时如何调用它们。

    我希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      SELECT * FROM table_nametable_name 中选择所有列及其值。您使用的是从架构表中选择所有列名(其中不包含您的table_name 中的信息)。

      您可以在 PHP 中使用 SELECT * FROM table_name 并使用 mysqli_fetch_assoc 来获得一个关联数组,该数组基本上是一个 key => value 数组,其中 key 是列名,value 是该列的值在数组的给定行中。

      从 PHP 文档 (http://php.net/manual/en/mysqli-result.fetch-assoc.php) 中提取目录,因为您想要一个示例:

      <?php
      $mysqli = new mysqli("localhost", "my_user", "my_password", "world");
      
      /* check connection */
      if ($mysqli->connect_errno) {
          printf("Connect failed: %s\n", $mysqli->connect_error);
          exit();
      }
      
      $query = "SELECT * FROM table_name";
      
      if ($result = $mysqli->query($query)) {
      
          /* fetch associative array */
          while ($row = $result->fetch_assoc()) {
              printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);
          }
      
          /* free result set */
          $result->free();
      }
      
      /* close connection */
      $mysqli->close();
      ?>
      

      【讨论】:

      • 我需要,因为我想在其他表中动态插入列名作为行值。
      • 您可以在 PHP 中使用上面的内容,只需使用 mysqli_fetch_assoc 即可获得一个关联数组,该数组基本上是一个 key =&gt; value 数组,其中 key 是列名,value 是数组中给定行中该列的值。
      • 网上有很多教程,我建议你看看其中的一些。然后总是有the manual, written in many languages我意识到一个激进的想法,但是当一切都失败了!!!!
      • SELECT * FROM WHERE COLUMN_NAME NOT IN ('id', 'semid')..这就是我需要的。我必须跳过某些列及其行值。我已经尝试过您的答案,但它不起作用,因为我们必须指定列名。列名未知。所以 $row['unknown']
      • 请注意,array_keys($row) 将为您提供该行中的所有列名。
      猜你喜欢
      • 2015-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-13
      • 2011-05-14
      • 1970-01-01
      • 2023-04-08
      相关资源
      最近更新 更多