7

空のテーブルで SELECT を実行したいのですが、すべての列名を含む 1 つのレコードを取得したいと考えています。テーブルから列名を取得する方法が他にもあることは知っていますが、ある種の 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 = 1ますWHERE 1

于 2014-03-26T13:31:25.607 に答える
6

SHOW COLUMNS と情報スキームについて投稿した他の回答者へ。OP は明確に次のように述べています。

読み方を学ぶ。


とにかく、あなたの質問に答えるために; いいえ、できません。空のテーブルから行を選択することはできません。空のテーブルから、空の値を持つ行でさえありません。

ただし、これを行うために適用できるトリックがあります。

1 つの列と 1 つの行だけを含む「ダミー」という追加のテーブルを作成します。

表:ダミー

dummy_id: 1

それで全部です。これで、次のような select ステートメントを実行できます。

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

これは常に 1 行を返します。ただし、「dummy_id」列も含まれています。ただし、もちろんそれを無視して、(空の)データを好きなように処理できます。

繰り返しますが、これは SELECT ステートメントでそれを行うための単なるトリックです。これを行うデフォルトの方法はありません。

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

これにより、テーブル構造を説明する結果セットが得られます。結果は、PHP を使用して非常に簡単に解析できます。

もう 1 つの方法は、情報スキーマ テーブルを照会することです。

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 ドライバーの 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 />";
    }

?>
于 2013-05-07T16:23:53.153 に答える
0

途中でPDOがなくても、データベースは少なくとも1つの行がないと構造を返しません。これを実行して、データ行を無視することができます。

SELECT * FROM cf_pagetree_elements LIMIT 1;

またはあなたは単にすることができます

DESC cf_pagetree_elements;

フィールドごとに1行を処理します。

WHERE 1=0私にはうまくいきません。常にを返しますempty set

于 2012-06-01T16:34:39.060 に答える
0

Oracle または MySQL の完全なソリューション

任意または一部の列 (私の目標は、大文字と小文字に関係なく、DB にあるものとまったく同じ任意の列を取得することです)

任意のテーブル (行ありまたは行なし)

    $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 に答える