php - sql选择字段 - 表字段




MySQL查询获取列名称? (12)

我想在MySQL中将所有的mysql表格的col名称放入一个数组中?

有没有这个问题?


在工作中:

global $wpdb;   $table_name=$wpdb->prefix.'posts';
foreach ( $wpdb->get_col( "DESC " . $table_name, 0 ) as $column_name ) {
  var_dump( $column_name );
}

最简单的解决方案出来的答案:

DESC `table name`

要么

DESCRIBE `table name`

要么

SHOW COLUMNS FROM `table name`

不知道这是你在找什么,但这对我有效:

$query = query("DESC YourTable");  
$col_names = array_column($query, 'Field');

它以字符串的形式返回表或数组中列名/变量名的简单数组,这是我需要动态构建MySQL查询的。 我的沮丧是,我根本不知道如何用PHP索引数组,所以我不知道如何处理来自DESC或SHOW的结果。 希望我的回答对像我这样的初学者有帮助!

检查结果: print_r($col_names);



在MySQL 5.1(不是5.5)中的SHOW COLUMNS使用临时磁盘表。

所以在某些情况下可以认为是缓慢的。 至少,它可以提升你的created_tmp_disk_tables值。 假设每个连接或每个页面请求都有一个临时磁盘表。

SHOW COLUMNS并不是很慢,可能是因为它使用文件系统缓存。 Phpmyadmin一直说〜0.5ms。 这与服务wordpress页面的500ms-1000ms相比毫无意义。 但是,有时候它很重要。 有一个磁盘系统的参与,你永远不知道当服务器忙,缓存满了,hdd停滞等等时会发生什么。

通过SELECT * FROM ... LIMIT 1检索列名约为0.1ms,它也可以使用查询缓存。

所以这里是我的小优化代码来从表中获取列名,如果可能的话,不使用显示列

function db_columns_ar($table)
{
//returns Array('col1name'=>'col1name','col2name'=>'col2name',...)
if(!$table) return Array();
if(!is_string($table)) return Array();

global $db_columns_ar_cache;
if(!empty($db_columns_ar_cache[$table]))
    return $db_columns_ar_cache[$table];


//IMPORTANT show columns creates a temp disk table
$cols=Array();
$row=db_row_ar($q1="SELECT * FROM `$table` LIMIT 1");
if($row)
    {
    foreach($row as $name=>$val)
        $cols[$name]=$name;
    }
else
    {
    $coldata=db_rows($q2="SHOW COLUMNS FROM `$table`");
    if($coldata)
        foreach($coldata as $row)
            $cols[$row->Field]=$row->Field;
    }
$db_columns_ar_cache[$table]=$cols;
//debugexit($q1,$q2,$row,$coldata,$cols);
return $cols;
}

笔记:

  • 只要你的表的第一行不包含兆字节范围内的数据,它应该可以正常工作。
  • 函数名称db_rowsdb_row_ar应该替换为您的特定数据库设置。

如果你使用php,请使用这个gist

它可以获得没有结果的选择字段完整信息,以及所有自定义字段,如:

SELECT a.name aname, b.name bname, b.* 
FROM table1 a LEFT JOIN table2 b
ON a.id = b.pid;

如果上面的sql没有返回数据,还会得到字段名aname,bname,b的其他字段名

只有两行:

$query_info = mysqli_query($link, $data_source);
$fetch_fields_result = $query_info->fetch_fields();

您可以对MYSQL使用以下查询:

SHOW columns FROM your-table;

下面是示例代码,它显示了如何在php中实现上面的语法来列出列的名称:

$sql = "SHOW COLUMNS FROM your-table";
$result = mysqli_query($conn,$sql);
while($row = mysqli_fetch_array($result)){
    echo $row['Field']."<br>";
}

有关SHOW COLUMNS FROM TABLE输出的详细信息,请访问: MySQL Refrence。


我没有专家,但这对我有用。

$sql = "desc MyTable";
$result = @mysql_query($sql);
while($row = @mysql_fetch_array($result)){
    echo $row[0]."<br>"; // returns the first column of array. in this case Field

      // the below code will return a full array-> Field,Type,Null,Key,Default,Extra    
      // for ($c=0;$c<sizeof($row);$c++){echo @$row[$c]."<br>";}    

}

旧的PHP函数“mysql_list_fields()”已弃用。 所以,今天获取字段名称的最好方法是查询“SHOW COLUMNS FROM table_name [LIKE'name']”。 所以,这里有一个小例子:

$fields = array();
$res=mysql_query("SHOW COLUMNS FROM mytable");
while ($x = mysql_fetch_assoc($res)){
  $fields[] = $x['Field'];
}
foreach ($fields as $f) { echo "<br>Field name: ".$f; }

最好的方法是使用INFORMATION_SCHEMA元数据虚拟数据库。 特别是INFORMATION_SCHEMA.COLUMNS表...

SELECT `COLUMN_NAME` 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' 
    AND `TABLE_NAME`='yourtablename';

它非常强大,并且可以为您提供大量的信息,而无需解析文本(如列类型,列是否可以为空,最大列大小,字符集等)。

哦,它是标准的SQL(而SHOW ...是MySQL特定的扩展)...

有关SHOW...和使用INFORMATION_SCHEMA表之间区别的更多信息,请查看INFORMATION_SCHEMA的MySQL 文档,一般来说 ...


该查询获取数据库中所有列的列表,而不必指定表名。 它只返回列名称列表:

SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS
  WHERE table_schema = 'db_name'

但是,当我在phpmyadmin中运行这个查询时,它显示了一系列的错误。 尽管如此,它的工作。 所以谨慎使用它。


这个问题很古老,但我到了这里寻找一种方式来以动态的方式(不一定只是一个表的字段)查找给定查询的字段名称。 而且由于人们不断指出这是其他相关问题中给定任务的答案,所以我用Gavin Simpson的提示分享了我发现可以完成的方式:

//Function to generate a HTML table from a SQL query
function myTable($obConn,$sql)
{
    $rsResult = mysqli_query($obConn, $sql) or die(mysqli_error($obConn));
    if(mysqli_num_rows($rsResult)>0)
    {
        //We start with header. >>>Here we retrieve the field names<<<
        echo "<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"0\"><tr align=\"center\" bgcolor=\"#CCCCCC\">";
        $i = 0;
        while ($i < mysqli_num_fields($rsResult)){
           $field = mysqli_fetch_field_direct($rsResult, $i);
           $fieldName=$field->name;
           echo "<td><strong>$fieldName</strong></td>";
           $i = $i + 1;
        }
        echo "</tr>"; 
        //>>>Field names retrieved<<<

        //We dump info
        $bolWhite=true;
        while ($row = mysqli_fetch_assoc($rsResult)) {
            echo $bolWhite ? "<tr bgcolor=\"#CCCCCC\">" : "<tr bgcolor=\"#FFF\">";
            $bolWhite=!$bolWhite;
            foreach($row as $data) {
                echo "<td>$data</td>";
            }
            echo "</tr>";
        }
        echo "</table>";
    }
}

这可以很容易地被修改,以将字段名称插入到数组中。

使用简单的: $sql="SELECT * FROM myTable LIMIT 1"可以为您提供任何表的字段,而无需使用SHOW COLUMNS或任何额外的php模块(如果需要的话)(删除数据转储部分)。

希望这可以帮助别人。







mysql