2016-12-23 2 views
1

Я пытаюсь обернуть голову вокруг нормализации таблиц, код, который я собрал ниже, предназначен для демонстрационных целей и не является производством. Я создал две таблицы, таблицу users и таблицу eye_color, поэтому у меня может быть отношение от одного до многих между двумя.Учебная таблица объединяется в php mysqli

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

$sql = "SELECT * 
     FROM users 
     INNER JOIN eye_color 
     ON user.eye_color = eye_color.id"; 

$result = mysqli_query($conn, $sql); 


if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_assoc($result)) { 
     echo $row['id']; 
     echo $row['eye_color']; 
    } 
} else{ 
    echo 'No results'; 
} 

Я не ищу прямой ответ. Я ищу совет, чтобы я мог двигаться вперед и продолжать понимать.

Моя структура таблицы, как следующее:

Table name: users 
id (PK) 
name 
email (Unique) 
eye colour (FK) 

Table name: eye_color 
id (PK) 
color 
+0

Возможно, вам понадобится левое соединение вместо внутреннего соединения. [Это хорошее объяснение разных типов объединений] (https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/) – aynber

+0

будет много возможных цветов глаз для пользователя? если да, оставайтесь вместе, вам нужно –

+0

@PeterDarmis Ну, каждый пользователь будет указывать в этом примере один цвет глаз – danjbh

ответ

3

У вас есть ошибка синтаксиса. И дополнительно добавьте обратные тики к своим запросам. user зарезервировано MySQL keyword.

$sql = "SELECT `users`.`name`,`eye_color`.`color` 
     FROM `users` 
     INNER JOIN `eye_color` 
     ON `users`.`eye_color` = `eye_color`.`id`"; // not `user`.`eye_color` 

$result = mysqli_query($conn, $sql); 


if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_assoc($result)) { 
     echo $row['name']; 
     echo $row['color']; 
    } 
} else{ 
    echo 'No results'; 
} 
+0

О, ничего себе, поэтому я действительно понимал, чего хочу достичь, спасибо вам за то, что заметили это! – danjbh

+0

Итак, с объединением вроде этого, можно ли выводить строку/varchar цвета глаз, повторяя строку eye_color? – danjbh

+0

Теперь вы можете @danjbh просто извлекать данные, которые вам действительно нужны из базы данных, которые являются именем пользователя и цветом, если вам нужна электронная почта, также вы можете выбрать ... почему все '*'? –

2

Ваш запрос кажется хорошо, учитывая, что users.eye_color ссылки eye_color.id. Проблема, которую я вижу в вашем коде, заключается в том, что вы пытаетесь использовать $row['eye_color'] для отображения названия цвета, тогда как это будет идентификатор eye_color. Вы должны использовать $row['color'].

В целом, чтобы отлаживать такие проблемы, вы можете сделать var_dump($row), чтобы вы могли точно видеть, какие ключи/значения содержит результат.

// ... 
if (mysqli_num_rows($result) > 0) { 
    while($row = mysqli_fetch_assoc($result)) { 
     var_dump($row); 
     //... 
    } 
} else { 
    echo 'No results'; 
} 
+0

Благодарим вас за ваш вклад, который имеет гораздо больше смысла. – danjbh

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