首页 > 解决方案 > 如何使用 SQL INNER JOIN 打印出名称而不是 ID

问题描述

其实我不知道我怎么能做到这一点,因为这是我第一次这样做。我的数据库中有 2 个表。

Table 1 users
Table 2 Transfer History.

这是我的代码:

SELECT u.id
     , u.fname
     , u.lname
     , t.sender_id
     , t.beneficiary_id
     , t.amount
     , t.date_posted 
  from transfers t
  JOIN users u
    ON u.id = t.sender_id 
 WHERE u.id = '".$id."' 
 ORDER 
    BY t.date_posted DESC

我使用

                                    <?php $i = 1; while($row = ): ?>
                                            <tr>
                                                <td><?= $i++ ?></td>
                                                <td><?= $row['sender'] ?></td>
                                                <td><?= $row['sender'] ?></td>
                                                <td><?= $i++ ?></td>
                                                <td><?= $i++ ?></td>
                                            </tr>
                                    <?php endwhile ?>

我不想回显 beneficiary_id 我想从用户数据库中回显受益人姓名

标签: mysqlsqljoin

解决方案


并不是每个人都知道,对于数据库,没有规定您只能将一个表连接到一个查询中一次。看起来您需要加入两次用户,一次用于发送付款的人,一次用于接收付款的人:

    SELECT 
      su.fname as sender_fname,
      su.lname as sender_lname,
      bu.fname as beneficiary_fname,
      bu.lname as beneficiary_lname,
      t.sender_id,
      t.beneficiary_id,
      t.amount,
      t.date_posted
  FROM
    transfers t
    JOIN users su ON su.id = t.sender_id 
    JOIN users bu ON bu.id = t.beneficiary_id 
  WHERE su.id = '".$id."' 
  ORDER BY t.date_posted DESC

您的查询结果集现在包含发送者和接收者的名称,并且它们的别名不同,因此您可以使用别名在 php 中引用其中一个或另一个

重要的是要注意,您不能只提及一次用户表并使用 OR(您不能说ON u.id = t.sender_id OR u.id = t.beneficiary_id),因为这会导致数增加 - 每次传输您将获得两行。为了便于参考“这笔付款是从这个人发送给那个人”,您希望增加数,而不是行数。对于 100 笔付款,您需要一个结果集,即“100 行两列;a from 和 a to”您不希望“一列的 200 行同时包含 from 和 to,在不同的行上”


推荐阅读