2016-04-06 10 views
0

私はPHPが初めてで、私のコードを理解できません。私はMySQLとPHPを使用しています。PHP、MySQL - JOINs

表:人 PK:lastNameの、FirstNameとHIREDATE、imgName

表:validMajors PK:majorAbbrev その他のフィールド:majorDesc

(ジャンクション)表:personMajors 他のフィールドをPERSONID personID、majorAbbrev

コードを実行すると(NATURAL JOIN)は、画像を表示し、最後に&ファーストネームと雇用日を表示します。どちらが素晴らしいです!しかし、私は彼らの専攻も表示する必要があります(私はmajorAbbrevを表示したいです)。また、人のテーブルにいるが、personMajorsのテーブルにない人は表示されません。人のテーブルにスタッフがいるため(学生ではないために専攻がない)、

ここに私のコードです:

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

すべてのアイデア/ソリューションは非常に高く評価されます!

答えて

2

あなたが適切concatenatingあなたのphpではありませんので。 $row["lastName"]と表示された後、echoが終了しました(;)。

あなたはこれらの3つのテーブルに参加しようとすることができます:

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>'; 
+0

2番目の提案でmajorAbbrevが表示されました!おかげさまで私が今必要としていた進歩はどれですか? –

1

(2回目の試行):主要な関係を持つ人物は、1対1か多対多ですか?

OK、このSELECTステートメントは動作するはずです:

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

これは空白のページを表示します(私のHTMLは表示されますが、データベース情報はありません)。 –

+0

Joinテーブルを誤解しています - 私の謝罪です。 – KC135Q