Bir mysql sorgu alanları kaynak tablo tanımlamak için nasıl

4 Cevap php

I have two dynamic tables (tabx and taby) which are created and maintained through a php interface where columns can be added, deleted, renamed etc. I want to read all columns simulataneously from the two tables like so;-

tabx dan, Taby * seçmek nerede ...;

Ben her sütun tabx veya Taby ya geldi olsun sorgunun sonucundan söylemek mümkün olmak istiyorum - tam sütun adlarını dönmek için mysql zorlamak için bir yol var, örneğin tabx.col1, tabx.col2, taby.coln vb?

4 Cevap

PHP, bu kadar (ben uzun zaman önce yazdığım bir proje çalınan) gibi, sonuç gelen alanın bilgi alabilirsiniz:

/*
Similar to mysql_fetch_assoc(), this function returns an associative array
given a mysql resource, but prepends the table name (or table alias, if
used in the query) to the column name, effectively namespacing the column
names and allowing SELECTS for column names that would otherwise have collided
when building a row's associative array.
*/
function mysql_fetch_assoc_with_table_names($resource) {
    // get a numerically indexed row, which includes all fields, even if their names collide
    $row = mysql_fetch_row($resource);
    if( ! $row)
        return $row;

    $result = array();

    $size = count($row);    
    for($i = 0; $i < $size; $i++) {
        // now fetch the field information
        $info = mysql_fetch_field($resource, $i);
        $table = $info->table;
        $name = $info->name;
        // and make an associative array, where the key is $table.$name
        $result["$table.$name"] = $row[$i];  // e.g. $result["user.name"] = "Joe Schmoe";
    }

    return $result;
}

Sonra bu gibi kullanabilirsiniz:

$resource = mysql_query("SELECT * FROM user JOIN question USING (user_id)");
while($row = mysql_fetch_assoc_with_table_names($resource)) {
    echo $row['question.title'] . ' Asked by ' . $row['user.name'] . "\n";
}

Yani doğrudan soruyu cevaplamak için, tablo adı veriler her zaman MySQL ile gönderilen - Her sütun nereden geldiğini anlatmak için müşteriye kalmış. Eğer gerçekten MySQL kasıt her sütun adını dönmek isterseniz, Shabbyrobe önerdi @ gibi, açıkça aliasing yapmak için sorguları değiştirmeniz gerekir.

Yapar:

SELECT tabx.*, taby.* FROM tabx, taby WHERE ...

çalışır?

Ben sol başarmak için çalışıyoruz ne merak ediyorum. Her şeyden önce, ekleme ve bir tablodan sütun kaldırarak garip bir uygulamadır; bu verilerin şema çalışma zamanı değişiyor anlamına gelir.

Ayrıca, aynı anda iki tablodan sorgulamak için, aralarında bir ilişki bir tür olması gerekir. Bir tablodaki satırlar diğer tablonun satır ile bir şekilde ilişkili olmalıdır. Bu durumda değilse, iki ayrı SELECT sorguları yaparken daha iyiyiz.

Sorunuzun cevabı zaten verilmiştir: SEÇİN tabloismi * Verilen tablodaki tüm sütunları almak için.. Bu veya iki tabloda aynı isimde sütun varsa düzgün çalışmayabilir; Eğer belgelerde o kadar bakmak gerekir.

Sen bize çözmeye çalışıyoruz sorun hakkında daha fazla bilgi verebilir misiniz? Ben bu konuda yanlış şekilde gidiyoruz iyi bir şans olduğunu düşünüyorum.

, Bir kenara bunu yapmak isteyebilirsiniz neden hakkında herhangi bir soru bırakarak, ve neden bir çapraz burada tüm katılmak yapmak isterim burada Kafamın üst kapalı gelebilir en iyi yoldur.

Her masada bir İZAH ve sonuç gelen programlama select ifadesi oluşturmak deneyebilirsiniz. İşte size rumuzlu bir dinamik olarak oluşturulan alan listesini verecek bir komut dosyası kötü bir örnek. Dinamik oluşturulan sorgu her tablo (Bu oldukça kolay önbelleğe alma ile hafifletilmiş olabilir rağmen) İZAH sorgu atılmasına neden olacak gibi bu olsa gerçekleştirmek sorguların sayısını artıracaktır.

<?php
$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));
function aliasFields($pdo, $table, $delim='__') {
    $fields = array();
    // gotta sanitise the table name - can't do it with prepared statement
    $table = preg_replace('/[^A-z0-9_]/', "", $table);
    foreach ($pdo->query("EXPLAIN `".$table."`") as $row) {
        $fields[] = $table.'.'.$row['Field'].' as '.$table.$delim.$row['Field'];
    }
    return $fields;
}
$fieldAliases = array_merge(aliasFields($pdo, 'artist'), aliasFields($pdo, 'event'));
$query = 'SELECT '.implode(', ', $fieldAliases).' FROM artist, event';
echo $query;

Sonuç iki alt çizgi (ya da ne gibi delimeter, aliasFields üçüncü parametre (bkz.)) ayrılmış tablo ve sütun adı ile, bu gibi bir sorgu:

// ABOVE PROGRAM'S OUTPUT (assuming database exists)
SELECT artist__artist_id, artist__event_id, artist__artist_name, event__event_id, event__event_name FROM artist, event

Eğer sonuçları yineleme zaman oradan, sadece yapabileceğiniz bir tablo adını ve alan adını almak için aynı Ayraç ile her alan adının patlayabilir.


John Douthat cevabı yukarıdaki daha iyidir. PDO bazı sürücüler ile durum olabilir tehdit olarak alan meta, veritabanı tarafından döndürülen değil eğer sadece yararlı olacaktır.

İşte John yerine mysql_ * PDO kullanarak suggetsted ne için nasıl basit bir parçası olduğunu ():

<?php

$pdo = new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE=>PDO::ERRMODE_EXCEPTION));

$query = 'SELECT artist.*, eventartist.* FROM artist, eventartist LIMIT 1';
$stmt = $pdo->prepare($query);
$stmt->execute();

while ($row = $stmt->fetch()) {
	foreach ($row as $key=>$value) {
		if (is_int($key)) {
			$meta = $stmt->getColumnMeta($key);
			echo $meta['table'].".".$meta['name']."<br />";
		}
	}
}