Как получить определенные значения через связывание внешнего ключа в MySQL? - PullRequest
2 голосов
/ 15 ноября 2010

извините за неясное название, но я не смог придумать ничего лучшего.

Моя дилемма заключается в следующем:

У меня есть одна таблица InnoDB в моей базе данных, называемая "встречи" сследующая структура:

  • meeting_id (первичный ключ, auto_increment)
  • user1_id (внешний ключ, указывающий на user_id в таблице с именем «users»)
  • user2_id (foreignключ, указывающий на user_id в таблице с именем «users»)
  • время (тип DATETIME)
  • местоположение (тип VARCHAR (200))

таблица "users "является основным и выглядит следующим образом:

  • user_id (первичный ключ, auto_increment)
  • first_name (тип VARCHAR (30))
  • last_name (тип VARCHAR (30))

У меня есть файл PHP с целью просто распечатать описание собрания, например:

Вы сохранили следующую информацию о собрании:

Пользователь 1 |Пользователь 2 |Время и дата |Место встречи

Джон Доу |Джейн Доу |2010-10-10 10:10:10 |Нью-Йорк

Теперь я просто хочу использовать идентификатор встречи, вызвать мою базу данных (только таблицу "встречи") и получить имена и фамилии user1 и user2.

Прямо сейчас мой нерабочий код выглядит следующим образом:

$query = "SELECT * FROM meetings WHERE meeting_id = " . $mid;
$data  = mysqli_query($dbc, $query);
$row   = mysqli_fetch_array($data); // ANY CHANGES HERE?

...

echo '<p>You saved the following meeting information::</p>';
echo '<table>';
echo '<tr><th>User 1</th><th>User 2</th><th>Time & Date</th><th>Meeting location</th></tr>';
echo '<td>' . $row['user1_id']['first_name'] . ' ' . $row['user1_id']['last_name'] . '</td>'; // NON-WORKING
echo '<td>' . $row['user2_id']['first_name'] . ' ' . $row['user2_id']['last_name'] . '</td>'; // NON-WORKING
echo '<td>' . $row['date_time'] . '</td>';
echo '<td>' . $row['location'] . '</td>';       
echo '</table>';
...

(Как) я могу получить ссылки first_name / last_name без отдельных вызовов таблицы «users»?Когда я проверяю phpMyAdmin, ссылки внешнего ключа InnoDB работают нормально.Большое спасибо заранее!

Ответы [ 4 ]

3 голосов
/ 15 ноября 2010

Если ваш запрос будет

$query = "SELECT time, location, user1.first_name, user1.last_name, user2.first_name, user2.last_name FROM meetings m JOIN users user1 ON m.user1_id = user1.id JOIN users user2 ON m.user2_id = user2.id WHERE meeting_id = " . $mid;

Тогда имена должны быть доступны как

$row['user1.first_name']

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

EDIT:
В качестве дополнительного примечания: наличие столбцов, заканчивающихся цифрами, такими как user1_id и user2_id, обычно поднимает красный флаг в глазах людей, которые понимают нормализацию и дизайн базы данных. По сути, это сводится к вопросу - готовы ли вы признать, что ваши встречи будут поддерживать только встречи между двумя людьми и только двумя людьми? Другой вопрос, на который вы должны ответить: вы уверены, что хотите провести различие между «первым» и «вторым» участником собрания? (текущий дизайн затруднит ответ на такие вопросы, как - перечислить все собрания для $user. При текущей раскладке таблицы вам придется тестировать оба поля по отдельности, что может снизить производительность)

1 голос
/ 15 ноября 2010

Вы не можете, user1_id содержит только одно число, вам нужно запросить таблицу пользователей, чтобы получить эту информацию.К счастью, его можно приобрести через соединение:

SELECT u1.first_name, u1.last_name, u2.first_name, u2.last_name,meetings.time, meetings.location FROM meetings
JOIN users u1 ON meetings.user1_id=u1.user_id
JOIN users u2 ON meetings.user2_id=u2.user_id
WHERE meeting_id = 
1 голос
/ 15 ноября 2010

Из документов MySQL :

Внешние ключи в SQL используются для проверки и обеспечения ссылочной целостности, а не для объединения таблиц.Если вы хотите получить результаты из нескольких таблиц из оператора SELECT, вы делаете это, выполняя соединение между ними:

SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id;
1 голос
/ 15 ноября 2010

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

SELECT u1.first_name, u1.last_name, u2.first_name, u2.last_name, m.time, m.location from meetings m inner join users u1 on m.user_id1 = u1.user_id inner join users u2 on m.user_id2 = u2.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...