2015-03-17 3 views
0

Я хотел бы выбрать некоторую информацию, которую я сохранил в моей базе данных MySQL. Например, у меня есть 2 таблицы gameTable и playerTable. Теперь я хочу получить gameTable и получить имена и уровни этих игроков. Как мне это сделать??Извлечение нескольких таблиц MySQL, join

enter image description here

Это то, что я получил до сих пор, она работает, но я не уверен, что это самый эффективный способ. Нужно ли мне создавать соединение для каждой строки?

<?php 

include ('connect.php'); 


$result = mysqli_query($connect, 
     "SELECT gameTable.id, 
      playerTable1.name AS name1, playerTable1.level AS level1, 
      playerTable2.name AS name2, playerTable2.level AS level2, 
      playerTable3.name AS name3, playerTable3.level AS level3, 
      playerTable4.name AS name4, playerTable4.level AS level4 
     FROM gameTable 
      JOIN playerTable AS playerTable1 ON gameTable.P1_id = playerTable1.id 
      JOIN playerTable AS playerTable2 ON gameTable.P2_id = playerTable2.id 
      JOIN playerTable AS playerTable3 ON gameTable.P3_id = playerTable3.id 
      JOIN playerTable AS playerTable4 ON gameTable.P4_id = playerTable4.id 
     "); 

    while ($record = mysqli_fetch_array($result)) 
    { 
     echo $record['id'] . " - " 
      . $record['name1'] . " - " . $record['level1'] . " - " 
      . $record['name2'] . " - " . $record['level2'] . " - " 
      . $record['name3'] . " - " . $record['level3'] . " - " 
      . $record['name4'] . " - " . $record['level4'] . "<br>"; 
    } 

?> 

Второй вопрос, моя база данных установлена ​​в MyISAM. Было бы полезно изменить его на InnoDB? Или это полезно только для удаления обновлений и т. Д. В вашей базе данных, а не для получения данных?

+0

Эй, мужчина. Это может быть лучше подходит для http://codereview.stackexchange.com/. Люди там действительно вступают в конструктивную обратную связь по эффективности решения и т. Д. – mvbrakel

+0

soo ... только для уточнения: этот код работает по назначению? Это не спасение для предполагаемых прецедентов? И вам нужна обратная связь по любым или всем аспектам кода? Тогда ваш вопрос будет по теме для CR (дополнительная информация в [справочном центре] (http://codereview.stackexchange.com/help/on-topic)) – Vogel612

+0

Код выглядит отлично. Любая оптимизация зависит от вашего приложения. Например, вы можете использовать MySQL Views. Но это может замедлить работу приложения, если есть много игр, так как у вас нет ключей в представлении. И в отношении MyISAM vs. InnoDB: снова в зависимости от вашего приложения, но мне кажется, что данные в этих двух таблицах не меняются слишком часто. Тогда InnoDB может быть преимуществом, поскольку инструкции SELECT быстрее. – Paul

ответ

0

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

$myarr = array(); 
while ($record = mysqli_fetch_array($result)) 
    { 
    $myarr[] = $record['id'] ; 
    $myarr[] = " - " ; 
    $myarr[] = $record['name1'] ; 
    $myarr[] = " - " ; 
    $myarr[] = $record['level1']; 
    $myarr[] = " - "; 
    $myarr[] = $record['name2']; 
    $myarr[] = " - "; 
    $myarr[] = $record['level2']; 
    $myarr[] = " - "; 
    $myarr[] = $record['name3']; 
    $myarr[] = " - "; 
    $myarr[] = $record['level3']; 
    $myarr[] = " - "; 
    $myarr[] = $record['name4']; 
    $myarr[] = " - "; 
    $myarr[] = $record['level4']; 
    $myarr[] = "<br>"; 
} 
echo implode('',$myarr); 
unset($myarr); 
Смежные вопросы