2013-08-27 2 views
0

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

У меня есть база данных Я пытаюсь извлечь данные из 4 таблиц.

Сначала я получаю список категорий из таблицы animal_list.

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

Это хорошо работает. Он отображает все данные о животных, разбитые на три категории.

Теперь я пытаюсь получить атрибуты животных из 2 других баз данных. Поэтому мне нужно, чтобы он взял animal_id и выполнил поиск в таблице skill_per_char, где он найдет идентификатор навыка, связанный с animal_id и skill_id, затем ему нужно выполнить поиск по таблице навыков и вытащить имя для навыка, соответствующего идентификатору.

Я пробовал использовать отдельные вызовы SQL, но он не отображает каждое умение для каждого животного только первого, и это даст ошибку для всего остального, у которого не было навыка. Поэтому я попытался добавить в другой цикл, где я хочу, чтобы данные появлялись, и это не покажет навык для животных с навыками, а затем даст ошибки для всего остального. Поэтому я попробовал цикл for, для каждого поиска животных навыков и отображения их, которые просто пошатнулись, и я установил сообщение об ошибках по электронной почте. В итоге у меня было 3500 ошибок. Это продолжалось, поэтому мне пришлось убить процесс.

Я много делал с подобными вещами, и это нормально работает, но на этот раз у некоторых животных есть более одного навыка, поэтому я должен сделать цикл while для них, но я просто не могу его достать Работа.

Благодаря

[[[[EDIT]]]]

Я исправил эту проблему. Возможно, это не правильный способ сделать это, но он работает.

Вот что я сделал:

$g = "SELECT * FROM animal_list"; 
$r = mysqli_query($dbc, $g) or trigger_error("Query: $g\n<br />MySQL Error: " . mysqli_error($dbc)); 

while ($ani = mysqli_fetch_array($r, MYSQLI_ASSOC)) { 

$b = "SELECT * FROM animal WHERE group_id = {$ani['group_id']}"; 
$B = mysqli_query($dbc, $b) or trigger_error("Query: $b\n<br />MySQL Error: " . mysqli_error($dbc)); 


echo '<div style="float: left; padding: 20px;"> 

<table width="800" border="1" cellspacing="2" cellpadding="2" align="center">'; 
echo '<tr><td colspan="13" align="center"><b>' . $ani['group'] . '</b></td></tr>'; 
echo '<tr> 
      <td align="left"><b>Name:</b></td> 
      <td align="left"><b>Skills:</b></td> 
      </tr>'; 
    while ($animal = mysqli_fetch_array($B, MYSQLI_ASSOC)) { 
    echo '<tr> 
      <td align="left">' . $animal['name'] .'</td> 
      <td align="left">'; 

      $a = "SELECT skill_id FROM skill_per_char WHERE char_id = {$animal['animal_id']}"; 
      $A = mysqli_query($dbc, $a) or trigger_error("Query: $a\n<br />MySQL Error: " . mysqli_error($dbc)); 

      if (mysqli_num_rows($A) > 0) { 
       while ($aniskill = mysqli_fetch_array($A)) { 

       $k = "SELECT name FROM skills WHERE skill_id = {$aniskill['skill_id']}"; 
      $K = mysqli_query($dbc, $k) or trigger_error("Query: $k\n<br />MySQL Error: " . mysqli_error($dbc)); 

      $askill = mysqli_fetch_array($K); 

       echo '' . $askill['name'] . ' ';  
       } 
      } 
      echo '</td> 
      </tr>'; 
} 
    echo '</table></div>'; 
} 

Я знаю таблицы плохо, но это работает для моего выхода. Я удалил другие данные поля. В базе данных животных содержится 12 значений.

В любом случае это работает, спасибо всем.

+1

Покажите нам Схемы. – Mihai

+1

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

+0

Посмотрите на команды SQL JOIN и INNER JOIN и RIGHT JOIN и LEFT JOIN –

ответ

0

Возможно, вы ищете JOINS в sql. Существует множество учебных пособий по объединению. Продолжай учиться. MySQL поддерживает внутренние, левые, правые и кросс-соединения.

+0

Я работаю с объединениями, я думаю, я не знаю все о них. Я не знал, как вытащить все данные из таблицы животных, а затем взять animal_id оттуда и сопоставить его с char_id в таблице skill_per_char.Затем получите skill_id из идентификатора skills_per_char и сопоставьте его с Skill_id из таблицы навыков, чтобы получить имя навыка. Я не знал, что у вас может быть WHERE char_id = animal_id, а затем WHERE skill_id = skill_id. Может быть, если бы я добавил другую таблицу или изменил animal_id на char_id, я не знаю. – DataCorrupt

0

Это звучит как оператор выбора, чтобы дать вам то, что вы ищете может выглядеть примерно так:

SELECT a.animal_name, s.skill_name 

FROM animals AS a 

     JOIN skill_per_char AS spc ON a.animal_id = spc.char_id 
     JOIN skills AS s ON spc.skill_id = s.skill_id 

ORDER BY a.animal_name, s.skill_name; 
+0

О, круто. Я попробую это и посмотрю, как это происходит. Спасибо! – DataCorrupt

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