7

我想在一个空表上执行 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

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

4

9 回答 9

9

除了w00 回答的内容之外,还有一个甚至不需要虚拟表的解决方案

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

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

于 2014-03-26T13:31:25.607 回答
6

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

学着阅读。


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

但是,您可以应用一个技巧来执行此操作。

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

表:假人

dummy_id: 1

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

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

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

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

于 2012-06-01T17:23:58.007 回答
3
SHOW COLUMNS FROM cf_pagetree_elements;

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

另一种方法是查询信息模式表:

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

虽然不是很推荐!

于 2012-06-01T16:39:41.587 回答
2

你可以试试:

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

不确定您的特定 PHP+PDO 方法(可能会有并发症),但这是获取列标题(字段名称)的标准方法。

于 2012-06-01T16:35:58.703 回答
1

这将列出支持 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 />";
    }

?>
于 2013-05-07T16:23:53.153 回答
0

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

SELECT * FROM cf_pagetree_elements LIMIT 1;

或者你可以简单地

DESC cf_pagetree_elements;

并处理每个字段一行。

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

于 2012-06-01T16:34:39.060 回答
0

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));
   }
于 2018-12-14T10:03:33.713 回答
0

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);
    }
于 2021-05-19T11:14:27.300 回答
-1

您可以将 MetaData 用于;

 $cols = mysql_query("SHOW COLUMNS FROM $tableName", $conn);
于 2012-06-01T16:39:17.887 回答