2010-11-15 141 views
2

对不清楚的标题感到抱歉,但我不能提出任何更好的。如何通过MySQL中的外键链接检索某些值?

我的困境是:

我在我的数据库中的一个InnoDB表名为 “会议” 具有以下结构:

  • MEETING_ID(主键,AUTO_INCREMENT)
  • user1_id(外键指向一个名为“users”的表中的user_id)
  • user2_id(外键指向一个名为“users”的表中的user_id)
  • time(type DATETIME)
  • 位置(类型VARCHAR(200))

表 “用户” 是基本的和看起来像这样:

  • USER_ID(主键,AUTO_INCREMENT)
  • first_name的(类型VARCHAR( 30))
  • 姓氏(类型VARCHAR(30))

我与目的PHP文件简单地首席T出了会议,例如:的描述

你救了以下会议信息:

用户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 /姓氏链接?当我检查phpMyAdmin时,InnoDB外键链接似乎工作正常。提前谢谢了!

回答

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与当前表的布局,你将不得不分别测试这两个领域,这可能会影响性能)

+0

非常感谢精细查询,它确实有帮助。关于你对数据库设计的其他评论,不要担心:在我的例子中,我的名字只是'简化'的变量名,我的数据库看起来并不像这样。 :)不过,再次感谢! – BeeDog 2010-11-16 08:19:00

+0

我现在在脚本中使用$ row ['userX.first_name'],但它根本不起作用。这里是我的查询字符串(用userX取代医生/病人'更好'的抽象): --- $ query =“SELECT patient.first_name,patient.last_name,doctor.first_name,doctor.last_name,appointmentments.date_time,appointment .description从约会JOIN用户患者ON约会.patient_app_id = patient.user_id加入用户医生ON约会.doctor_app_id = doctor.user_id WHERE约会ID =“。 $援助; --- echo'​​'。 $ row ['patient.first_name']。 ''。 $ row ['patient.last_name']。 ''; – BeeDog 2010-11-16 09:30:46

+1

看上去'SELECT time,location,user1.first_name AS user1_first_name ...'更安全,后来引用为'$ row ['user1_first_name']'或在您的病例中,等等...... – Unreason 2010-11-16 10:18:46

1

那么,你必须利用用户表来从中获取数据。这是特有的。但是,你只能有一个查询,这是我认为你是后:

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 
1

MySQL docs

SQL中的外键用于检查 和强制引用完整性,而不是 来加入表格。如果你想从 SELECT语句获取多个表 结果,您可以通过 为此进行它们之间的连接:

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

你不能,只有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 = 
+0

很好的例子!但只是一个后续问题;之后我如何回应u1的名字和姓氏?我尝试过: echo'​​'。 $ row ['u1.first_name']]。 ''。 '$ row ['u1.last_name']]。 ''; 但它不会工作。我尝试了不同的变化,但我无法弄清楚。如果我删除了“u1”。部分在上面的回声中,我可以打印出u1名称,但由于显而易见的原因,我无法使用它打印出u2,因为无法区分用户u1和u2。 – BeeDog 2010-11-16 08:58:36

+1

最后一次我检查你可以按照你描述的方式来做,但你也可以说'SELECT u1.first_name AS u1fn'然后调用'$ row ['u1fn']',这不是一个好方法这样做,也许你可以做一个循环来显示'$ row'和它们的键的所有内容......'foreach($ row as $ key => $ value)''然后找出合适的键是什么样的。也许'$ row ['u1'] ['first_name']'idk我大部分时间都是通过框架从PHP中抽象出SQL。 – 2010-11-16 09:16:02

+0

是的,我会同意这不是最好的方法,但至少它工作。谢谢!我仍然困惑于为什么我无法获得常规的userX.first_name方法来工作... – BeeDog 2010-11-16 10:28:48