【问题标题】:PHP, MySQL - JOINsPHP, MySQL - 连接
【发布时间】:2016-04-06 10:31:09
【问题描述】:

我是 PHP 新手,但我无法弄清楚我的代码。我正在使用 MySQL 和 PHP。

表:人 PK:个人ID 其他字段:lastName、firstName、hireDate、imgName

表:有效专业 PK:主要缩写 其他领域:majorDesc

(联结)表:personMajors personID,主要缩写

当我运行我的代码(使用NATURAL JOIN)时,它将显示图像、姓氏和名字以及雇用日期。太棒了!但我也需要它来显示他们的专业(我希望显示专业缩写)。它也不会显示在 person 表中但不在 personMajors 表中的人,这是一个问题,因为我们在 person 表中有工作人员(他们没有专业,因为他们不是学生)

这是我的代码:

<table align="center">
    <?php
        $connection = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);

        if ( mysqli_connect_errno() ) {
           die( mysqli_connect_error() );  
        }
        $sql = "SELECT * FROM person NATURAL JOIN personMajors ORDER BY lastName";

        if ($result = mysqli_query($connection, $sql)) {     
           // loop through the data

           $columns=4;
           $i = 0;
            while($row = mysqli_fetch_assoc($result))
            {

            if($i % $columns ==0){


                 echo "<tr>";
                 }

                 echo "<td class='staffImage badgeText frameImage displayInLine'>" . "<img src='images/staff/".$row['imgName'].".jpg'>". "<br>". 
                                                            "<strong>" . $row['firstName'] . "</strong>" ." ". 
                                                            "<strong>" . $row['lastName'] . "</strong>" . "<br>" .
                                                            "Hire Date: ".$row['hireDate'] ."</td>";
                                                            "Major: " .$row['majorAbbrev'] ."</td>";     //Does not display

if($i % $columns == ($columns - 1)){
                 echo "</tr>";               
            }

            $i++;
            }
            // release the memory used by the result set
            mysqli_free_result($result); 
        } 
        // close the database connection
        mysqli_close($connection); 
    ?>
    </table>

任何想法/解决方案将不胜感激!

【问题讨论】:

    标签: php mysql join natural-join


    【解决方案1】:

    因为你不是concatenating你的php正确。您在显示 $row["lastName"] 后结束了 (;) 您的 echo

    您可以尝试这些来加入三个表:

    SELECT * FROM person
           LEFT JOIN personMajors ON person.personID = personMajors.personID
           LEFT JOIN validMajors ON personMajors.majorAbbrev = validMajors.majorAbbrev
    

    或者您可以定义在查询中调用哪些列:

    SELECT person.personID,
           person.lastName,
           person.firstName,
           person.hireDate,
           person.imgName,
           validMajors.majorAbbrev,
           validMajors.majorDesc
    FROM person
           LEFT JOIN personMajors ON person.personID = personMajors.personID
           LEFT JOIN validMajors ON personMajors.majorAbbrev = validMajors.majorAbbrev
    

    然后你可以用你现在调用的方式调用结果(更干净的版本):

    echo '<td class="staffImage badgeText frameImage displayInLine">
              <img src="images/staff/'.$row["imgName"].'.jpg"><br>
              <strong>'.$row["firstName"].'</strong>
              <strong>'.$row["lastName"].'</strong><br>
              Hire Date: '.$row["hireDate"].'
              Major: '.$row["majorAbbrev"].'
          </td>';
    

    【讨论】:

    • 您的第二个建议让majorAbbrev 显示!这正是我现在需要的进度提升,谢谢!
    【解决方案2】:

    (第二次尝试):人和主要关系是一对一还是一对多?

    好的,这个 SELECT 语句应该可以工作了:

    SELECT person.*, validMajors.* FROM person AS p, validMajors AS vm,   personMajors AS pm WHERE p.personID = pm.personID AND pm.majorAbbrev = vm.majorAbbrev 
    

    【讨论】:

    • 这会产生一个空白页面(我的 HTML 显示,但没有数据库信息)
    猜你喜欢
    • 2020-12-11
    • 2012-11-10
    • 1970-01-01
    • 2023-03-20
    • 2012-10-07
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多