php 如何从两次联接的同一表中检索值[duplicate]

7bsow1i6  于 2023-03-07  发布在  PHP
关注(0)|答案(5)|浏览(128)
    • 此问题在此处已有答案**:

How to resolve ambiguous column names when retrieving results?(11个答案)
5天前关闭。
很抱歉标题不清楚,但我想不出更好的。
我的困境是:
我的数据库中有一个InnoDB表,名为"meetings",结构如下:

  • 会议ID(主键,自动递增)
  • user1_id(指向名为"users"的表中的user_id的外键)
  • user2_id(指向名为"users"的表中的user_id的外键)
  • 时间(类型DATETIME)
  • 位置(类型VARCHAR(200))

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

  • 用户标识(主键,自动递增)
  • 名字(类型VARCHAR(30))
  • 姓氏(键入VARCHAR(30))

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

  • 您保存了以下会议信息:*
  • 用户1|用户2|时间和日期|会议地点 *
  • 无名氏|无名氏|2010年10月10日10时10分10秒|纽约 *

现在,我只想使用会议ID,调用我的数据库(仅"meetings"表),并能够获得user1和user2的first_name和last_name。
现在,我的非工作代码如下所示:

$query = "SELECT * FROM meetings WHERE meeting_id = 1";
$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>';
...

(How)我可以在不单独调用"users"表的情况下检索名字/姓氏链接吗?2当我检查phpMyAdmin时,InnoDB外键链接似乎工作正常。3提前感谢!

d6kp6zgx

d6kp6zgx1#

如果您的查询是

$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的所有会议。使用当前表格布局,您必须分别测试这两个字段,这可能会影响性能)

r9f1avp5

r9f1avp52#

MySQL docs
SQL中的外键用于检查和实施参照完整性,而不是用于联接表。如果要从SELECT语句的多个表中获取结果,可通过在这些表之间执行联接来实现:

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

vsnjm48y3#

你必须利用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
hmae6n7t

hmae6n7t4#

不能这样做,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 =
ippsafx7

ippsafx75#

您必须查询users表以获取first_name和last_name列中的值。为此,您需要连接users表

$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;

相关问题