如何通过MySQL中的外键链接检索某些值?

时间:2010-11-15 14:23:22

标签: php mysql foreign-keys

抱歉标题不清楚,但我无法想出更好的东西。

我的困境是:

我的数据库中有一个名为“meetings”的InnoDB表,其结构如下:

  • meeting_id(主键,auto_increment)
  • user1_id(指向名为“users”的表中的user_id的外键)
  • user2_id(指向名为“users”的表中的user_id的外键)
  • 时间(类型DATETIME)
  • location(type VARCHAR(200))

表“users”是基本的,如下所示:

  • user_id(主键,auto_increment)
  • first_name(类型VARCHAR(30))
  • last_name(类型VARCHAR(30))

我有一个PHP文件,目的是简单地打印出会议的描述,例如:

您保存了以下会议信息:

用户1 |用户2 |时间与时间日期|会议地点

John Doe | Jane Doe | 2010-10-10 10:10:10 |纽约

现在,我只想使用会议ID,调用我的数据库(只有“会议”表),并能够获取user1和user2的first_name和last_name。

现在,我的非工作代码如下所示:

$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 个答案:

答案 0 :(得分:3)

如果您的查询是

$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']

等等。 外键不是神奇的设备,总是带来相关的记录(也不应该)。

修改
作为旁注 - 具有以user1_iduser2_id等数字结尾的列通常会在理解规范化和数据库设计的人的脑海中引起一个红旗。基本上它归结为这个问题 - 你准备好接受你的会议只支持两个人和两个人之间的会议吗?您应该回答的另一个问题是:您确定要区分会议的“第一”和“第二”参与者吗? (目前的设计将更难回答诸如以下问题 - 列出$user的所有会议。使用当前的表格布局,您必须分别测试两个字段,这可能会影响性能)

答案 1 :(得分:1)

嗯,您必须利用users表从中获取数据。这是地方性的。但是你只能有一个查询,这就是我认为你所追求的:

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

答案 2 :(得分:1)

来自MySQL docs

  

SQL中的外键用于检查   并强制执行参照完整性   加入表格。如果你想得到   来自a的多个表的结果   SELECT语句,你这样做   在他们之间进行联接:

SELECT * FROM t1 INNER JOIN t2 ON t1.id = t2.id;

答案 3 :(得分:1)

你不能,user1_id只包含一个数字,你必须查询users表来获取该信息。幸运的是,它可以通过加入获得:

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 =