2014-08-30 6 views
0

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

$tables = array('table_one', 'table_two', 'table_three'); 
$final = array(); 

foreach($tables as $table) { 
    $sql = "SELECT * FROM ".$table.""; 
    $query = mysqli_query($con, $sql)or die(mysqli_error($con)); 
    $num = mysqli_num_rows($query); 
    $i = 0; 

    while($row = mysql_fetch_array($query)) { 
     $id[$i] = $row['user_id']; 

     $i++; 
    } 

    for($i=0;$i<$num;$i++) { 
     if(!is_array($final[$i])) { 
      $final[$i] = array($id[$i]); 
     } else { 
      array_push($final[$i], $id[$i]); 
     } 
    } 
} 

Конечные результаты что-то, что выглядит как этот

$final = array(array('table_one_row_one_val', 'table_two_row_one_val', 'table_three_row_one_val'), 
      array('table_one_row_two_val', 'table_two_row_two_val', 'table_three_row_two_val'), 
      array('table_one_row_three_val', 'table_two_row_three_val', 'table_three_row_three_val') 
     ); 

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

Спасибо,

Lance

+3

Используйте MySQL JOIN вместо трех отдельных таблиц. http://dev.mysql.com/doc/refman/5.1/en/join.html –

+0

Да, но нет никаких общности между значениями строк в таблицах – Lance

+0

Если нет какой-либо общности, почему вы извлекаете три таблицы? Это абсолютно логично. –

ответ

1

Вы можете сделать ваш код проще, если вы сделаете ваш запрос более явным в выборе столбцов, которые вы хотите в порядке, вы хотите их , Так, например:

$sql = 'SELECT table_one.user_id as u1, table_two.user_id as u2, table_three.user_id as u3 FROM ' . implode(',', $tables); 

Затем каждая строка результирующего набора будет иметь столбцы в правильном порядке, что делает конструкцию ваших массивов менее вовлеченных. Например:

$query = mysqli_query($con, $sql)or die(mysqli_error($con)); 

while($row = mysql_fetch_array($query)) { 
    $final[] = array($row['u1'], $row['u2'], $row['u3']); 
} 

Там могут быть проблемы, связанные с порядком и отношений данных в этих массивах (особенно, если все 3 таблицы не имеют одинаковое число строк), но работает только от информации выше, это другой способ, которым вы могли бы подходить к нему. Что-то подумать.

+0

Это страшное предложение. Что делать, если эти три таблицы имеют около 50 тыс. Строк. Это будет выбивать сервер с этим полным соединением – bksi

+0

bksi, без вопросов. Здесь есть много потенциальных ловушек (как я заметил), но у ОП есть эта проблема. Не зная об окружающей среде или данных, невозможно рекомендовать лучший общий дизайн. Я просто отвечал на этот вопрос, как сказано в надежде, что он даст OP что-то еще, о чем подумать. –

0

Попробуйте это:

$sql = "SELECT 'user_id' FROM ".$table; 
0

насчет:

$tables = array('table_one', 'table_two', 'table_three'); 
$final = array(); 

foreach($tables as $tableIndex => $table) { 
    $sql = "SELECT user_id FROM ".$table; 
    $query = mysqli_query($con, $sql)or die(mysqli_error($con)); 
    $i = 0; 

    while($row = mysql_fetch_array($query)) { 
     $final[$tableIndex][$i] = $row['user_id']; 
     $i++; 
    } 
} 

Это всегда лучше выбрать только столбцы, которые вы будете использовать. SELECT * не является хорошей практикой SQL.

Смежные вопросы