Sütun adlarını almak için MySQL sorgusu?


286

Ben php bir dizi içine bir mysql tablonun col adlarını almak istiyorum?

Bunun için bir sorgu var mı?

Yanıtlar:


513

En iyi yol BİLGİ_SCHEMA meta veri sanal veritabanını kullanmaktır. Özellikle BİLGİ_SCHEMA.COLUMNS tablosu ...

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

ÇOK güçlüdür ve metni ayrıştırmanıza gerek kalmadan size tonlarca bilgi verebilir (Sütun türü, sütunun boş olup olmadığı, maksimum sütun boyutu, karakter seti vb.) ...

Oh, ve standart SQL ( SHOW ...MySQL'e özgü bir uzantı olmasına rağmen ) ...

Tablolar arasındaki SHOW...ve INFORMATION_SCHEMAtabloların kullanımı hakkında daha fazla bilgi için genel olarak MySQL Belgelerine bakınINFORMATION_SCHEMA ...


27
Tablo adlarını belirtmek için bu aptal mysql'ye özgü backticks kullanmıyorsanız sadece standart SQL'dir. Onlardan nefret ediyorum, kodumu yanlış yapıyorlar.
MarkR

17
@MarkR Cevabı yazdığımda aslında onları dahil etmedim. Ama sonra sadece siyah bir yazı duvarı gibi görünüyordu. Bu yüzden sözdizimi vurgulamasından yararlanmak için geri keneler ekledim. Evet, elimden de geçebilirdim SET @@SESSION.sql_mode = 'ANSI_QUOTES';, ama gerçekten bundan hoşlanmıyorum. Ve tanımlayıcı sınırlaması için geri keneler ile ilgili bir sorunum yok. Aslında, onları çift tırnak daha iyi gibi (çift tırnak sorgu bana yanlış hissettiriyor) ... Her biri kendi ...
ircmaxell

2
Yukarıdaki örnekte tablo adlarının alıntılanması gerekmez.
MarkR

20
@MarkR Bunun olmadığını biliyorum. Bu yüzden cevabı yazarken aslında onları dahil etmediğimi söyledim . Sözdizimi vurgulama avantajlarından yararlanmak için ekledim ...
ircmaxell

4
InnodDB tabloları ile information_schema arasında seçim yapmak çok acı verici olabilir. Bazı sunucularda bir dakikadan fazla
macjohn

206

MYSQL için aşağıdaki sorguyu kullanabilirsiniz:

SHOW columns FROM your-table;

Aşağıda, sütunların adlarını listelemek için php'de yukarıdaki sözdiziminin nasıl uygulanacağını gösteren örnek kod verilmiştir:

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

SHOW COLUMNS FROM TABLEZiyaret çıktısıyla ilgili ayrıntılar için : MySQL Refrence.


5
Veya ... DESC TableName;;-)
double_j

Diziyi daha fazla sorgu için kaydetmenin bir yolu var mı? Beşinci sütundaki değeri almak için veritabanında $ row [4] aramak ister misiniz?
user3866044


21

Bunu geçmişte yaptım.

SELECT column_name
FROM information_schema.columns
WHERE table_name='insert table name here'; 


7

mysql_fetch_field()Tüm sütun verilerini görüntülemek için kullanın . El kitabına bakın .

$query = 'select * from myfield';
$result = mysql_query($query);
$i = 0;
while ($i < mysql_num_fields($result))
{
   $fld = mysql_fetch_field($result, $i);
   $myarray[]=$fld->name;
   $i = $i + 1;
}

"Uyarı Bu uzantı PHP 5.5.0'dan itibaren kullanımdan kaldırılmıştır ve gelecekte kaldırılacaktır."


2
mysqli_num_fields()ve mysqli_fetch_field_direct()güncellenmiş yöntemler
Gusstavv Gil

5

Eski bir PHP işlevi "mysql_list_fields ()" kullanımdan kaldırılmıştır. Bu nedenle, bugün alan adlarını almanın en iyi yolu "table_name [LIKE 'name'] dan COLUMNS GÖSTER" sorgusudur. İşte size küçük bir örnek:

$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; }

4
function get_col_names(){  
    $sql = "SHOW COLUMNS FROM tableName";  
    $result = mysql_query($sql);     
    while($record = mysql_fetch_array($result)){  
     $fields[] = $record['0'];  
    }
    foreach ($fields as $value){  
      echo 'column name is : '.$value.'-';  
}  
 }  

return get_col_names();

4

Aradığın şey olduğundan emin değilim, ama bu benim için çalıştı:

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

Bu, tablonuzdaki veya dizinizdeki sütun adlarının / değişken adlarının basit bir dizisini dizeler olarak döndürür, bu da MySQL sorgularını dinamik olarak oluşturmak için gerekli olan şeydir. Benim hayal kırıklığı ben sadece PHP dizileri çok iyi endeksleme bilmiyorum oldu, bu yüzden DESC veya SHOW sonuçları ile ne yapacağından emin değildi. Umarım cevabım kendim gibi yeni başlayanlar için faydalıdır!

Sonucu kontrol etmek için: print_r($col_names);


4

tüm tablo yapınızı bazı dosyalarla kontrol etmek istediğinizde bu kodu kullanın. Bu sorguda daha fazla ayrıntı için column_name, column_type ve table_name öğelerini seçiyorum. Ben kolayca görebilmeniz için column_type tarafından sipariş kullanın.

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' order by DATA_TYPE;

Eğer sadece çift tip eğe kontrol etmek istiyorsanız o zaman kolayca yapabilirsiniz

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' AND DATA_TYPE like '%bigint%'  order by DATA_TYPE;

resim açıklamasını buraya girin

hangi alanın null türüne izin verdiğini vb. kontrol etmek istiyorsanız bunu kullanabilirsiniz

SELECT `COLUMN_NAME`,COLUMN_TYPE,TABLE_NAME,IS_NULLABLE,DATA_TYPE 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_SCHEMA`='yourdatabasename' and DATA_TYPE like '%bigint%' and IS_NULLABLE ='NO' order by COLUMN_TYPE;

resim açıklamasını buraya girin

daha sonra kontrol etmek istiyorum thik bağlantı da size yardımcı olur.

https://dev.mysql.com/doc/refman/5.7/en/columns-table.html


İyi. Çok yararlı.
Sazzad Hissain Khan

3

Mysql 5.1'deki (5.5 değil) COLUMNS GÖSTER geçici bir disk tablosu kullanır.

Bu nedenle bazı durumlar için yavaş kabul edilebilir. En azından created_tmp_disk_tables değerinizi yükseltebilir . Her bağlantı veya her sayfa isteği için bir geçici disk tablosu düşünün.

SHOW COLUMNS , muhtemelen dosya sistemi önbelleği kullandığından çok yavaş değildir. Phpmyadmin sürekli ~ 0.5 ms diyor. Bu, bir wordpress sayfası sunmanın 500ms-1000ms ile karşılaştırıldığında hiçbir şey değildir. Ama yine de önemli zamanlar var. Bir disk sistemi katılımı vardır, sunucu meşgul olduğunda, önbellek dolu olduğunda, hdd durduğunda vb.

SELECT * FROM ... LIMIT 1 aracılığıyla sütun adları alınıyor ~ 0.1ms civarındaydı ve sorgu önbelleğini de kullanabilir.

Mümkünse , gösterme sütunlarını kullanmadan bir tablodan sütun adları almak için küçük optimize edilmiş kodum :

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;
}

Notlar:

  • Tablolarınızdaki ilk satır megabayt veri aralığı içermediği sürece, düzgün çalışmalıdır.
  • Db_rows ve db_row_ar işlev adları , özel veritabanı kurulumunuzla değiştirilmelidir.

Merhaba Johan, hata alıyorum: db_columns_ar ('myTableName') çalıştırdığımda tanımsız işlev db_row_ar () çağırın;
KarlosFontana

Bunun için üzgünüm, metinde netleştireceğim. Bu, veritabanı sınıfınızın veya kurulumunuzun bu tür şeyler için kullandığı her şeye dayanan hayali bir işlev adıdır.
Johan

3

Ben şahsen kullanmak bunu bir deneyin:

SHOW COLUMNS FROM $table where field REGEXP 'stock_id|drug_name' 

1
neden yalnızca "stock_id" ve "drug_name" sütun adlarını seçiyorsunuz?
Frank Bryce

benim için çalıştı ama "nerede ..." şeyler olmadan. PDO ile: $ this-> dbHandle = yeni PDO (...); $ query = 'KOLONLARI GÖSTER'. $ tableName; $ stmt = $ this-> dbHandle-> sorgu ($ sorgu); $ results = $ stmt-> fetchAll (PDO :: FETCH_ASSOC); foreach ($ sonuçları $ sonuç olarak) {// her bir $ sonucu ile bir şeyler yapın}
Zaphoid

2

WORDPRESS'DE:

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

2

Bu soru eski, ama burada alan adını dinamik bir şekilde (mutlaka bir tablonun alanları değil) belirli bir sorgu bulmak için bir yol arıyorum var. Ve insanlar bunu diğer ilgili sorularda verilen görevin cevabı olarak göstermeye devam ettiğinden, Gavin Simpson'un ipuçlarını kullanarak yapılabileceğini bulduğum yolu paylaşıyorum:

//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>";
    }
}

Bu, alan adlarını bir diziye eklemek için kolayca değiştirilebilir.

Basit bir: $sql="SELECT * FROM myTable LIMIT 1"kullanarak, herhangi bir tablonun alanlarını, kullanmanıza gerek kalmadan SHOW COLUMNSveya herhangi bir ekstra php modülünü (gerekirse veri dökümü bölümünü kaldırarak) verebilirsiniz .

Umarım bu başka birine yardımcı olur.


2

Eğer php kullanıyorsanız, bu özü kullanın .

sonuç select ile seçim alanları tam bilgi ve gibi tüm özel alanlar alabilirsiniz:

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

sql üzerinde veri döndürmezseniz, alan adları aname, bname, b'nin diğer alan adını da alır

sadece iki satır:

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

2

Bu sorgu, tablo adı belirtmek zorunda kalmadan veritabanındaki tüm sütunların listesini getirir. Yalnızca sütun adlarının bir listesini döndürür:

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

Ancak, phpmyadmin bu sorguyu çalıştırdığımda, bir dizi hata görüntüledi. Yine de işe yaradı. Bu yüzden dikkatli kullanın.


2

Tüm Yanıtların en basit çözümü:

DESC `table name`

veya

DESCRIBE `table name`

veya

SHOW COLUMNS FROM `table name`

2

yalnızca alan adlarına ve türlerine ihtiyacınız varsa (belki de Excel'e kolay kopyalamak için):

SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='databasenamegoeshere'
AND DATA_TYPE='decimal' and TABLE_NAME = 'tablenamegoeshere'

Kaldırmak

DATA_TYPE='decimal'

tüm veri türlerini istiyorsanız


1

uzman değilim, ama bu benim için çalışıyor ..

$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>";}    

}

0

SQL Server'da bu sorguyu denedim ve bu benim için çalıştı:

SELECT name FROM sys.columns WHERE OBJECT_ID = OBJECT_ID('table_name')
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.