我想在一个空表上做一个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
任何人都知道我是否可以尝试另一种方法?
答案 0 :(得分:7)
添加到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 :(得分:6)
发布有关SHOW COLUMNS和信息方案的其他答案。 OP清楚地说:" 我知道还有其他方法可以从表中获取列名,但我想知道是否可以使用某种SELECT查询。 "
学会阅读。
无论如何,回答你的问题;不,你不能。您无法从空表中选择一行。从空表开始,甚至没有空值的行。
然而,您可以申请这样做。
创建一个名为' dummy'的附加表格。只有一列和一行:
表:虚拟
dummy_id: 1
这就是全部。现在你可以这样做一个select语句:
SELECT * FROM dummy LEFT OUTER JOIN your_table ON 1=1
这将始终返回一行。但它包含' dummy_id'专栏也是。然而,您可以忽略该行为并使用您想要的(空)数据。
再说一次,这只是一个用SELECT语句来做的技巧。没有默认的方法来完成这项工作。
答案 2 :(得分:1)
你可以尝试:
SELECT * FROM information_schema.columns
WHERE table_name = "cf_pagetree_elements"
不确定您的特定PHP + PDO方法(可能存在复杂性),但这是获取列标题(字段名称)的标准方法。
答案 3 :(得分:1)
这将列出支持getColumMeta的PDO驱动程序的ANY查询列。我在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 />";
}
?>
答案 4 :(得分:0)
即使没有PDO,数据库也不会在没有至少一行的情况下返回结构。您可以这样做并忽略数据行:
SELECT * FROM cf_pagetree_elements LIMIT 1;
或者你可以简单地
DESC cf_pagetree_elements;
每个字段处理一行。
WHERE 1=0
对我不起作用。它总是返回empty set
。
答案 5 :(得分:0)
SHOW COLUMNS FROM cf_pagetree_elements;
这将给出一个解释表结构的结果集。您可以使用PHP轻松解析结果。
另一种方法是查询信息模式表:
SELECT column_name FROM information_schema.columns WHERE table_name='cf_pagetree_elements';
虽然不是真的推荐!
答案 6 :(得分:0)
用于SQLSVR的最新PDO肯定可以与get列元一起使用。
只需设置您的语句并使用它来获取有用的信息数组:
$stmt->execute();
$meta= array();
foreach(range(0, $stmt->columnCount() - 1) as $column_index)
{
array_push($meta,$stmt->getColumnMeta($column_index));
}
答案 7 :(得分:0)
Oracle 或 MySQL 的完整解决方案
对于任何或某些列(我的目标是获取与数据库中完全相同的任意列,无论大小写)
对于任何表(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);
}
答案 8 :(得分:-1)
你可以使用MetaData;
$cols = mysql_query("SHOW COLUMNS FROM $tableName", $conn);