【问题标题】:Select on empty table but still get column names在空表上选择但仍然获得列名
【发布时间】:2012-06-01 16:29:22
【问题描述】:

我想在一个空表上执行 SELECT,但我仍然想返回一条包含所有列名的记录。我知道还有其他方法可以从表中获取列名,但我想知道是否可以使用某种 SELECT 查询。

当我直接在 MySQL 中运行它时,我知道它可以工作:

SELECT * FROM cf_pagetree_elements WHERE 1=0;

但我使用的是 PHP + PDO (FETCH_CLASS)。这只是给了我一个空对象,而不是包含所有列名(具有空值)的行。因此,由于某种原因,该查询不适用于 PDO FETCH_CLASS。

$stmt = $this->db->prepare ( $sql );
$stmt->execute ( $bindings );
$result = $stmt->fetchAll ( \PDO::FETCH_CLASS, $class );
print_r($result); // Empty object... I need an object with column names

有人知道我是否可以尝试另一种方法吗?

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    除了w00 answered,还有一个甚至不需要虚拟表的解决方案

    SELECT tbl.* 
    FROM (SELECT 1) AS ignore_me 
        LEFT JOIN your_table AS tbl 
            ON 1 = 1 
    LIMIT 1 
    

    在 MySQL 中,您可以将 WHERE 1 = 1 更改为 WHERE 1

    【讨论】:

    • 最好添加限制 1 - 因为该表可能有一天会被填满
    • @YourCommonSense 好主意。完成
    • 这就是答案。所选答案需要创建表的权限。很有可能需要使用 SELECT 来确定列名的原因是因为权限限制了人们以另一种方式进行操作。
    【解决方案2】:
    SHOW COLUMNS FROM cf_pagetree_elements;
    

    这将给出一个解释表结构的结果集。你可以很容易地用 PHP 解析结果。

    另一种方法是查询信息架构表:

    SELECT column_name FROM information_schema.columns WHERE table_name='cf_pagetree_elements';
    

    虽然不推荐!

    【讨论】:

      【解决方案3】:

      你可以试试:

      SELECT * FROM information_schema.columns
      WHERE table_name = "cf_pagetree_elements"
      

      不确定您的特定 PHP+PDO 方法(可能会出现复杂情况),但这是获取列标题(字段名称)的标准方法。

      【讨论】:

        【解决方案4】:

        致发布有关 SHOW COLUMNS 和信息方案的其他答案。 OP 明确表示:“我知道还有其他方法可以从表中获取列名,但我想知道是否可以使用某种 SELECT 查询。”

        学习阅读。


        无论如何,回答你的问题;不,你不能。您不能从空表中选择一行。甚至没有来自空表的空值行。

        但是,您可以应用一个技巧来做到这一点。

        创建一个名为“dummy”的附加表,其中只有一列和一行:

        表格:虚拟

        dummy_id: 1
        

        就是这样。现在您可以执行这样的选择语句:

        SELECT * FROM dummy LEFT OUTER JOIN your_table ON 1=1
        

        这将始终返回一行。然而,它也包含“dummy_id”列。但是,您当然可以忽略这一点,并随心所欲地处理(空)数据。

        再说一次,这只是一个使用 SELECT 语句的技巧。没有默认方法可以完成此操作。

        【讨论】:

        • 您实际上可以从带有 pdo 的空查询中获取列名。使用 getColumnMeta 函数
        【解决方案5】:

        这将列出支持 getColumMeta 的 PDO 驱动程序的任何查询的列。我将它与 SQL 服务器一起使用,即使在具有别名表、子查询和联合的非常复杂的查询上也能正常工作。即使结果为零也给我列

        <?php 
        
        
            // just an example of an empty query.
            $query =$PDOdb->query("SELECT  * from something where 1=0; "); 
            for ($i=0; $i<$query->columnCount(); $i++) {
                echo $query->getColumnMeta($i)['name']."<br />";
            }
        
        ?>
        

        【讨论】:

          【解决方案6】:

          即使没有 PDO,数据库也不会返回没有至少一行的结构。您可以这样做并忽略数据行:

          SELECT * FROM cf_pagetree_elements LIMIT 1;
          

          或者你可以简单地

          DESC cf_pagetree_elements;
          

          每个字段处理一行。

          WHERE 1=0 对我不起作用。它总是返回empty set

          【讨论】:

            【解决方案7】:

            SQLSVR 的最新 PDO 绝对适用于 get column meta。

            只需设置您的语句并使用它来获取一组有用的信息:

            $stmt->execute();
            $meta= array();
            foreach(range(0, $stmt->columnCount() - 1) as $column_index)
               {
                array_push($meta,$stmt->getColumnMeta($column_index));
               }
            

            【讨论】:

              【解决方案8】:

              Oracle 或 MySQL 的完整解决方案

              对于任何或某些列(我的目标是获得与 DB 中完全相同的任意列,无论大小写如何)

              对于任何表(w 或 w/o 行)

                  $qr = <<<SQL
              SELECT $cols 
              FROM (SELECT NULL FROM DUAL)
              LEFT JOIN $able t ON 1 = 0
              SQL;
              
                  $columns = array_keys($con->query($qr)->fetchAll(PDO::FETCH_ASSOC)[0]);
              
                  if($cols === "*") {
                      array_shift($columns);
                  }
              

              【讨论】:

                【解决方案9】:

                您可以将 MetaData 用于;

                 $cols = mysql_query("SHOW COLUMNS FROM $tableName", $conn);
                

                【讨论】:

                  猜你喜欢
                  • 2017-04-17
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-08-18
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-01-22
                  • 1970-01-01
                  相关资源
                  最近更新 更多