2009-02-01 2 views
1

Я хочу выполнить SQL запрос типа:Место несколько подобных полей в многомерном массиве - PHP MySQL

 
select 'tb1'.'f1','tb1'.'f2','tb2'.'f1' from 'tb1','tb2'; 

Теперь проблема заключается в том, что я хочу, чтобы поместить его в массив в PHP, как:

 
$result['tb1']['f1'], $result['tb1']['f2'], $result['tb2']['f1']... 

Любая идея, как достичь вышеуказанного? Afaik нет функции, которая делает выше. Мне было интересно, как лучше всего это сделать. Я не хочу использовать запрос, например «select .. as ..», если это необходимо.

Я заранее не знаю, какие поля будут, поэтому я не могу назначить их вручную, как это предлагает ответ by benlumley.

Спасибо, Alec

+0

как насчет сейчас? Я обновил его в свете того, что говорит карвин. – benlumley

ответ

3

Вам нужно будет выбрать данные, как вы уже делаете, а затем цикл над ним получить его в требуемом формате, и потому что поля имеют одинаковые имена, то его легче всего для использования псевдонимов или они просто перезаписывают друг друга в возвращаемых данных (но вместо этого вы можете использовать mysql_fetch_row, который возвращает числовой индексный массив).

Например:

$sql = "select tb1.f1 as tb1f1,tb1.f2 as tb1f2,tb2.f1 as tb2f1 from tb1,tb2"; 
$result = mysql_query($sql); 
while ($row = mysql_fetch_assoc($result)) { 
    $result['t1']['f1']=$row['tb1f1']; 
    $result['t1']['f2']=$row['tb1f2']; 
    $result['t2']['f1']=$row['tb2f1']; 
} 

(квотирования было неправильно в вашем SQL, а)

Это не будет обрабатывать несколько строк либо, но ваш вопрос вроде предполагает, что вы только когда-либо ожидал один ряд?

без псевдонимов:

$sql = "select tb1.f1,tb1.f2,tb2.f1 from tb1,tb2"; 
$result = mysql_query($sql); 
while ($row = mysql_fetch_row($result)) { 
    $result['t1']['f1']=$row[0]; 
    $result['t1']['f2']=$row[1]; 
    $result['t2']['f1']=$row[2]; 
} 

Я предпочитаю первый вариант, если у вас есть хороший повод, чтобы использовать второй, поскольку его менее вероятно, приведет к ошибкам, если вы когда-либо изменить SQL или добавлять поля и т.д.

EDIT:

Принимая мету представления данных из приведенного ниже ответа ....

<?php 
mysql_connect('localhost', 'username', 'password'); 
mysql_select_db('dbname'); 
$result = mysql_query('select tb1.f1, tb1.f2, tb2.f1 from tb1, tb2'); 
$meta = array(); 
for ($i = 0; $i < mysql_num_fields($result); ++$i) { 
    $meta[$i] = mysql_fetch_field($result, $i); 
} 
while ($row = mysql_fetch_row($result)) { 
    foreach($row as $key=>$value) { 
    $out[$meta[$key]->table][$meta[$key]->name]=$value; 
    } 
} 

, похоже, делает именно то, что вам нужно, хотя вы можете получить только одну строку за раз.

Легко обновляется, чтобы хранить несколько строк с другим измерением на массиве:

Изменение:

$out[$meta[$key]->table][$meta[$key]->name]=$value; 

To:

$out[][$meta[$key]->table][$meta[$key]->name]=$value; 
0

Приставка имен поле с короткой версией имени таблицы является хороший способ добиться этого без необходимости создавать псевдонимы в избранном. Конечно, вы не получаете точной структуры, которую вы описали, но каждое поле имеет свой уникальный индекс в массиве результатов. Например, предположим, что у вас есть пользователи таблиц, а у пользователя есть имя, затем вызовите это поле usr_name.

2

Так как вы говорите, что вы не можете указать псевдонимы столбцов, и вы не можете знать поле запроса заранее, я хотел бы предложить решение с использованием mysql_fetch_field() для получения метаданных:

<?php 
mysql_connect('localhost', 'username', 'password'); 
mysql_select_db('dbname'); 
$result = mysql_query('select tb1.f1, tb1.f2, tb2.f1 from tb1, tb2'); 
for ($i = 0; $i < mysql_num_fields($result); ++$i) { 
    $meta = mysql_fetch_field($result, $i); 
    print_r($meta); 
} 

Вы можете извлеките из этой метаданных информацию имя таблицы и имя столбца, даже если в запросе есть несколько столбцов с тем же именем.

PHP ext/mysqli поддерживает аналогичную функцию mysqli_stmt::result_metadata(), но вы сказали, что заранее не можете знать количество полей в запросе, что делает его неудобным использовать mysqli_stmt::bind_result().

PDO_mysql, похоже, не поддерживает метаданные набора результатов в настоящее время.


Результат приведенного выше сценария ниже.

stdClass Object 
(
    [name] => f1 
    [table] => tb1 
    [def] => 
    [max_length] => 1 
    [not_null] => 0 
    [primary_key] => 0 
    [multiple_key] => 0 
    [unique_key] => 0 
    [numeric] => 1 
    [blob] => 0 
    [type] => int 
    [unsigned] => 0 
    [zerofill] => 0 
) 
stdClass Object 
(
    [name] => f2 
    [table] => tb1 
    [def] => 
    [max_length] => 1 
    [not_null] => 0 
    [primary_key] => 0 
    [multiple_key] => 0 
    [unique_key] => 0 
    [numeric] => 1 
    [blob] => 0 
    [type] => int 
    [unsigned] => 0 
    [zerofill] => 0 
) 
stdClass Object 
(
    [name] => f1 
    [table] => tb2 
    [def] => 
    [max_length] => 1 
    [not_null] => 0 
    [primary_key] => 0 
    [multiple_key] => 0 
    [unique_key] => 0 
    [numeric] => 1 
    [blob] => 0 
    [type] => int 
    [unsigned] => 0 
    [zerofill] => 0 
) 
Смежные вопросы