Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用SQL内部联接&;使用外键从数据库获取数据的别名?_Php_Mysql_Sql_Inner Join_Alias - Fatal编程技术网

Php 如何使用SQL内部联接&;使用外键从数据库获取数据的别名?

Php 如何使用SQL内部联接&;使用外键从数据库获取数据的别名?,php,mysql,sql,inner-join,alias,Php,Mysql,Sql,Inner Join,Alias,我试图在表中显示数据,如下代码所示。我试图从名为用户的数据库表中获取请购单表(视图)中这3列的数据: 征用 批准人和 支付人 数据库中的表格如下所示。我将省略那些似乎工作正常的列 财务申请 | req_id | req_by | approved_by | disbursed_by | | ------ | ------ | ----------- | ------------ | | 1 | 1 | 2 | 3 | | 2

我试图在表中显示数据,如下代码所示。我试图从名为用户的数据库表中获取请购单表(视图)中这3列的数据:

  • 征用
  • 批准人和
  • 支付人
  • 数据库中的表格如下所示。我将省略那些似乎工作正常的列

    财务申请

    | req_id | req_by | approved_by | disbursed_by |
    | ------ | ------ | ----------- | ------------ |
    |    1    |    1    |     2     |      3       |
    |    2    |    1    |     2     |      3       |
    
    用户表格

    | id | username |
    | ------ | ------ | 
    |    1    |    Lisa    | 
    |    2    |    Anne    |
    |    3    |    John    |
    
    即使应该是不同的用户名,输出也始终为Lisa。我是一个noob,但从我所学到的到目前为止,这个问题可以通过正确使用SQL别名轻松解决,但我不知道如何解决,所以我问,我该如何修复这个专家

     <table class="table table-striped">
                    <thead>
                        <tr>
                            <td>ID</td>
                            <td>File</td>
                            <td>Expense Category</td>
                            <td>Amount Requisitioned</td>
                            <td>Details</td>
                            <td>Requisitioned By</td>
                            <td>Requisition Date</td>
                            <td>Approval Status</td>
                            <td>Amount Approved</td>
                            <td>Approved By</td>
                            <td>Date Approved</td>
                            <td>Disbursement Status</td>
                            <td>Amount Disbursed</td>
                            <td>Disbursed By</td>
                            <td>Date Disbursed</td>
                            <td>Note</td>
                            <td colspan=2>Actions</td>
                        </tr>
                    </thead>
                    <tbody>
                        <hr>
    
                        <?php
                        $sql = "
            SELECT fin_requisition.req_id            
                 , ops_files.file_name
                 , fin_expense_cats.expense_cat
                 , fin_requisition.amount
                 , fin_requisition.details
                 , users.username
                 , fin_requisition.req_date
                 , fin_approval_status.status
                 , fin_requisition.amt_approved
                 , users2.username
                 , fin_requisition.approval_date
                 , fin_disb_status.status
                 , fin_requisition.amt_disbursed
                 , users3.username
                 , fin_requisition.date_disbursed
                 , fin_requisition.notes FROM fin_requisition
              JOIN ops_files 
                ON fin_requisition.file = ops_files.file_id
              JOIN fin_expense_cats 
                ON fin_requisition.expense_cat = fin_expense_cats.cat_id
              JOIN users 
                ON fin_requisition.req_by = users.id 
              JOIN fin_approval_status 
                ON fin_requisition.approval_status = fin_approval_status.status_id
              JOIN users users2 
                ON fin_requisition.approved_by = users2.id 
              JOIN fin_disb_status 
                ON fin_requisition.disb_status = fin_disb_status.status_id 
              JOIN users users3 
                ON fin_requisition.disbursed_by = users3.id 
             ORDER 
                BY req_id ASC
                ";
                        $result = $mysqli->query($sql);
                        ?>
    
                        <?php foreach ($result as $row) : ?>
                            <tr>
                                <td><?php echo $row["req_id"]; ?></td>
                                <td><?php echo $row["file_name"]; ?></td>
                                <td><?php echo $row["expense_cat"]; ?></td>
                                <td><?php echo $row["amount"]; ?></td>
                                <td><?php echo $row["details"]; ?></td>
                                <td><?php echo $row["username"]; ?></td>
                                <td><?php echo $row["req_date"]; ?></td>
                                <td><?php echo $row["status"]; ?></td>
                                <td><?php echo $row["amt_approved"]; ?></td>
                                <td><?php echo $row["username2"]; ?></td>
                                <td><?php echo $row["approval_date"]; ?></td>
                                <td><?php echo $row["status"]; ?></td>
                                <td><?php echo $row["amt_disbursed"]; ?></td>
                                <td><?php echo $row["username3"]; ?></td>
                                <td><?php echo $row["date_disbursed"]; ?></td>
                                <td><?php echo $row["notes"]; ?></td>
                                <td>
                                    <a href="edit_requisition.php?req_id=<?php echo ($row["req_id"]); ?>" class="btn btn-primary">Edit</a>
                                </td>
                                <td>
                                    <a href="delete_requisition.php?req_id=<?php echo ($row["req_id"]); ?>" method="post">
                                        <button class="btn btn-danger" type="submit" onclick="return confirm('Are you sure you want to delete this record?')">Delete</button>
                                    </a>
                                </td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
    
    
    身份证件
    文件
    费用类别
    征用金额
    细节
    征用
    申请日期
    批准状态
    核准金额
    批准人
    批准日期
    支付状况
    支付金额
    支付人
    支付日期
    注
    行动
    

    在sql中,您应该为不同的用户名使用prpoer别名,例如:username usename2,username3

           SELECT fin_requisition.req_id            
             , ops_files.file_name
             , fin_expense_cats.expense_cat
             , fin_requisition.amount
             , fin_requisition.details
             , users.username 
             , fin_requisition.req_date
             , fin_approval_status.status
             , fin_requisition.amt_approved
             , users2.username username2
             , fin_requisition.approval_date
             , fin_disb_status.status
             , fin_requisition.amt_disbursed
             , users3.username username3
             , fin_requisition.date_disbursed
             , fin_requisition.notes FROM fin_requisition
          JOIN ops_files 
            ON fin_requisition.file = ops_files.file_id
          JOIN fin_expense_cats 
            ON fin_requisition.expense_cat = fin_expense_cats.cat_id
          JOIN users 
            ON fin_requisition.req_by = users.id 
          JOIN fin_approval_status 
            ON fin_requisition.approval_status = fin_approval_status.status_id
          JOIN users users2 
            ON fin_requisition.approved_by = users2.id 
          JOIN fin_disb_status 
            ON fin_requisition.disb_status = fin_disb_status.status_id 
          JOIN users users3 
            ON fin_requisition.disbursed_by = users3.id 
         ORDER 
            BY req_id ASC
    
    然后在php代码中引用这些列别名

    <td><?php echo $row["req_id"]; ?></td>
    <td><?php echo $row["file_name"]; ?></td>
    <td><?php echo $row["expense_cat"]; ?></td>
    <td><?php echo $row["amount"]; ?></td>
    <td><?php echo $row["details"]; ?></td>
    <td><?php echo $row["username"]; ?></td>
    <td><?php echo $row["req_date"]; ?></td>
    <td><?php echo $row["status"]; ?></td>
    <td><?php echo $row["amt_approved"]; ?></td>
    <td><?php echo $row["username2"]; ?></td>
    <td><?php echo $row["approval_date"]; ?></td>
    <td><?php echo $row["status"]; ?></td>
    <td><?php echo $row["amt_disbursed"]; ?></td>
    <td><?php echo $row["username3"]; ?></td>
    <td><?php echo $row["date_disbursed"]; ?></td>
    <td><?php echo $row["notes"]; ?></td>
    

    这里有很多问题

    让我们从更简单的事情开始

    考虑以下几点:

    DROP TABLE IF EXISTS requisitions;
    
    CREATE TABLE requisitions
    (req_id SERIAL PRIMARY KEY
    ,req_by INT NOT NULL
    ,approved_by INT NOT NULL
    ,disbursed_by INT NOT NULL
    );
    
    INSERT INTO requisitions VALUES
    (1,2,4,3),
    (2,4,4,2);
    
    DROP TABLE IF EXISTS users ;
    
    CREATE TABLE users 
    (id SERIAL PRIMARY KEY
    ,username VARCHAR(12) UNIQUE
    );
    
    INSERT INTO users VALUES
    (1,'Lisa'),
    (2,'Anne'),
    (3,'John');
    
    SELECT x.req_id 
         , r.username AS requisitioner -- the AS keyword is optional
         , a.username AS approver      -- and often
         , d.username AS disburser     -- omitted
      FROM requisitions x 
      LEFT 
      JOIN users r 
        ON r.id = x.req_by 
      LEFT 
      JOIN users a 
        ON a.id = x.approved_by 
      LEFT 
      JOIN users d
        ON d.id = x.disbursed_by;
    +--------+---------------+----------+-----------+
    | req_id | requisitioner | approver | disburser |
    +--------+---------------+----------+-----------+
    |      1 | Anne          | NULL     | John      |
    |      2 | NULL          | NULL     | Anne      |
    +--------+---------------+----------+-----------+
    

    所以,没有Lisa。

    似乎,对于您提供的示例数据,您需要将JOIN更改为lEFT JOIN。请看下面

     WITH REQ(req_id,req_by,approved_by,disbursed_by) AS
      (
         SELECT 1,2,4,3
           UNION ALL
         SELECT 2,4,4,2
      ),
     USERS(ID,USERNAME) AS
      (
         SELECT   1 ,  'Lisa'  
            UNION ALL
         SELECT 2,'Anne'
            UNION ALL
         SELECT 3,'JOHN'
    
      )
       SELECT R.REQ_ID,R.req_by,COALESCE(R_BY.USERNAME,'') AS REQUESTER,
        R.approved_by,COALESCE(APPRR_BY.USERNAME,'')AS APPROVER,
        R.disbursed_by,COALESCE(DISB_BY.USERNAME,'')AS DISBURSER
        FROM REQ AS R
         LEFT JOIN USERS AS R_BY ON R.req_by=R_BY.ID
         LEFT JOIN USERS AS APPRR_BY ON R.req_by=APPRR_BY.ID
         LEFT JOIN USERS AS DISB_BY ON R.disbursed_by=DISB_BY.ID
    

    @草莓nvm看起来应该这样。他们加入没问题,你应该在选择列表中使用
    users2.username作为username2
    ,与users3相同。否则他们会得到生成的名称,然后是'username'@Turo并修改php foreach代码?当然,在php代码中使用username2和username3,如果你是对的,我认为示例数据被破坏了,否则根本不会有结果。谢谢你的回答。我已经对它进行了改进,这样它就不再误导用户了。不过,您仍然没有使用列别名。