1

私は2つのmysqlステートメントを持っています。1つはスタッフ用の4つのリンクされたテーブルからすべての情報を取得します。別のテーブルにある各スタッフのタイトルを取得しようとしていますが、選択されているプラ​​イマリテーブルとは関係がないため、1ステートメントに追加できません。mysqlステートメントで約20のバリエーションを試しましたが、成功しませんでした。タイトルをプルして2番目のステートメントの変数を介して出力するように取得しましたが、すべての人に同じタイトルが付けられているため、再度ループしたときに変数が更新されていないようです。

最初のmysqlステートメントは読み取ります(簡略化されたバージョンは非常に長いです)

    SELECT staff_tbl.titleID FROM staff_tbl

2番目のmysqlステートメントは次のようになります

    SELECT titles_tbl.titleID, titles_tbl.titleName FROM titles_tbl WHERE titles_tbl.titleID = '" . $getTitle . "'"

変数は次のように設定されます($ row_rsOfficeLocationは最初のmysqlステートメントの結果です)

    $getTitle = $row_rsOfficeLocation['titleID'];

最初のステートメントで更新するたびに2番目のステートメントで要求されたときに$getTitle変数を更新する方法を知っている人はいますか?

編集:これがデータベース構造といくつかの値です

SET FOREIGN_KEY_CHECKS = 0;


-のテーブル構造city_tbl


存在する場合はテーブルを削除しcity_tblます; CREATE TABLE city_tblcityIDint(11)NOT NULL auto_increment、 cityNamevarchar(255)NOT NULL、PRIMARY KEY(cityID))ENGINE = MyISAM AUTO_INCREMENT = 83 DEFAULT CHARSET = utf8;


--city_tblの記録


INSERT INTO city_tblVALUES( '1'、'Aloha'); INSERT INTO city_tblVALUES( '2'、'Ann Arbor');


-のテーブル構造officelocations_tbl


存在する場合はテーブルを削除しofficelocations_tblます; CREATE TABLE officelocations_tbllocationIDint(11)NOT NULL auto_increment、 officeNamechar(255)NOT NULL、 address1varchar(285)NOT NULL、 address2varchar(285)デフォルトNULL、 cityIDint(11)NOT NULL、 stateIDint(11)NOT NULL、 zipCodeint(11)デフォルトのNULL、 officePhonevarchar(13)デフォルトのNULL、 contact1int(11)デフォルトのNULL、 contact2int(11)デフォルトのNULL、 partnerint(11)デフォルトのNULL、PRIMARY KEY(locationID)、KEY CitycityID)、KEY StatestateID)、KEY Contact1contact1)、KEY Contact2contact2)、KEY Partnerpartner))ENGINE = MyISAM AUTO_INCREMENT = 31 DEFAULT CHARSET = utf8;


--officelocations_tblのレコード


INSERT INTO officelocations_tblVALUES( '1'、'Atlanta'、 '5555 Some Ave'、'#311'、 '3'、 '10'、 '30041'、''、null、null、 '26'); INSERT INTO officelocations_tblVALUES( '2'、'Austin'、 '5555 Some Ave'、''、 '4'、 '43'、 '78734'、 '555-555-1212'、 '72'、null、'81 ' );


-のテーブル構造staff_tbl


存在する場合はテーブルを削除しstaff_tblます; CREATE TABLE staff_tblstaffIDint(11)NOT NULL auto_increment、 staffID_C2int(11)NOT NULL、 staffID_Pint(11)NOT NULL、 firstNamevarchar(255)NOT NULL、 middleInitialvarchar(15)デフォルトNULL、 lastNamevarchar(255)NOT NULL、 suffixvarchar(15)デフォルトNULL、 accredationsvarchar(150)デフォルトNULL、 emailvarchar(255)NOT NULL、 phonevarchar(25)NOT NULL、 mobilePhonevarchar(25)デフォルトNULL、 officePhonevarchar(25)デフォルトNULL、 faxNumbervarchar(25)デフォルトNULL、 address1varchar(255)NOT NULL、 address2varchar(255)デフォルトNULL、 cityIDint(11)NOT NULL、 stateIDint(11)NOT NULL、 zipCodeint(11)NOT NULL、 titleIDint(11)NOT NULL、 locationIDint(11)NOT NULL、 photoURLvarchar(255)デフォルトNULL、 vCardURLvarchar(255)デフォルトNULL、 qRCodeURLvarchar(255)デフォルトNULL、 resumeURLvarchar(255)デフォルトNULL、 biographylongtext、 dateCreated日付NOT NULL、PRIMARY KEY(staffID)、KEY StatestateID)、KEY LocationlocationID)、KEY TitleUSING BTREE (titleID)、KEY CityUSING BTREE(cityID)、KEY StaffUSING BTREE(staffID))ENGINE = MyISAM AUTO_INCREMENT = 102 DEFAULT CHARSET = utf8;


--staff_tblの記録


INSERT INTO staff_tblVALUES( '1'、 '1'、 '1'、'John'、''、'Doe'、''、''、'johndoe@someemail.com'、 '5555551212'、''、 '5555551212 '、' 5555551212'、' 5555 Some Ave。'、' Suite 8、#317'、' 21'、' 42'、' 55555'、' 3'、' 0'、''、''、''、 ''、 '1'、 '2012-08-02'); INSERT INTO staff_tblVALUES( '2'、 '2'、 '2'、'Jane'、''、'Doe'、''、''、'jandoe@someemail.com'、 '5555551212'、''、 '5555551212 '、' 5555551212'、' 555555 SW Some Ave'、''、' 1'、' 37'、' 55555'、' 3'、' 0'、''、''、''、


-のテーブル構造state_tbl


存在する場合はテーブルを削除しstate_tblます; CREATE TABLE state_tblstateIDint(11)NOT NULL auto_increment、 state_abreviationchar(10)NOT NULL、 state_namechar(100)NOT NULL、PRIMARY KEY(stateID))ENGINE = MyISAM AUTO_INCREMENT = 54 DEFAULT CHARSET = utf8;


--state_tblのレコード


INSERT INTO state_tblVALUES('51'、' DC'、' Washington DC'); INSERT INTO state_tblVALUES( '1'、'AL'、'Alabama');


-のテーブル構造titles_tbl


存在する場合はテーブルを削除しtitles_tblます; CREATE TABLE titles_tbltitleIDint(11)NOT NULL auto_increment、 titleNamevarchar(255)NOT NULL、PRIMARY KEY(titleID))ENGINE = MyISAM AUTO_INCREMENT = 15 DEFAULT CHARSET = utf8;


--titles_tblの記録


INSERT INTO titles_tblVALUES( '1'、'アソシエイトコンサルタント\r \ n'); INSERT INTO titles_tblVALUES( '2'、'最高財務責任者'); INSERT INTO titles_tblVALUES( '3'、'コンサルタント'); INSERT INTO titles_tblVALUES( '4'、'Director、Business Development'); INSERT INTO titles_tblVALUES( '5'、'LEAVE TITLE BLANK'); INSERT INTO titles_tblVALUES( '6'、'National Director of Information Technology'); INSERT INTO titles_tblVALUES( '7'、'National Director of Operations'); INSERT INTO titles_tblVALUES( '8'、'National Technical Director'); INSERT INTO titles_tblVALUES( '9'、'Partner'); INSERT INTO titles_tblVALUES( '10'、'地域コンサルタント'); 値に挿入titles_tbl( ' 11'、'シニアコンサルタント'); titles_tbl値に挿入( '12'、'副社長'); 挿入するtitles_tbl値('13'、'プロジェクト会計士'); INSERT INTO titles_tblVALUES( '14'、'');

サンプル出力は次のようになります。

サンプル出力 出力されるすべてのタイトルがすべてのスタッフメンバーで同じであるという事実を除いて、それは機能しています。私が使用しているコードは、2番目のselectステートメントで以前に投稿したコードです。titles_tblをメインのSQLステートメントに結合する方法を理解できればもっと簡単かどうかはわかりません。ユニオンから最初の選択の2番目の選択まで、いくつかのバリエーションを試しましたが、どれも機能していないか、エラーが発生します。

これは、結合のすべてのエイリアスを含めて使用した最初のSQLステートメントです。

    SELECT staff_tbl.staffID, staff_tbl.staffID_C2, staff_tbl.staffID_P, staff_tbl.firstName, staff_tbl.middleInitial, staff_tbl.lastName, staff_tbl.suffix, staff_tbl.accredations, staff_tbl.email, staff_tbl.phone, staff_tbl.mobilePhone, staff_tbl.officePhone, staff_tbl.faxNumber, staff_tbl.address1, staff_tbl.address2, staff_tbl.cityID, staff_tbl.stateID, staff_tbl.zipCode, staff_tbl.titleID, staff_tbl.locationID, staff_tbl.photoURL, staff_tbl.vCardURL, staff_tbl.qRCodeURL, staff_tbl.resumeURL, staff_tbl.biography, staff_tbl.dateCreated, officelocations_tbl.locationID, officelocations_tbl.officeName, officelocations_tbl.address1, officelocations_tbl.address2, officelocations_tbl.cityID, officelocations_tbl.stateID, officelocations_tbl.zipCode, officelocations_tbl.officePhone, officelocations_tbl.contact1, officelocations_tbl.contact2, officelocations_tbl.partner, city_tbl.cityID, city_tbl.cityName, state_tbl.stateID, state_tbl.state_abreviation, state_tbl.state_name, titles_tbl.titleID, titles_tbl.titleName,  contact1.firstName AS c1Firstname, contact1.lastName AS c1lastName, contact1.middleInitial AS c1middleInitial, contact1.suffix AS c1suffix,  contact1.accredations AS c1accredations, contact1.phone AS c1Phone, contact1.faxNumber AS c1FaxNumber, contact1.mobilePhone AS c1Mobile,  contact1.email AS c1Email, contact1.titleID AS c1Title,  contact2.firstName AS c2Firstname, contact2.lastName AS c2lastName, contact2.middleInitial AS c2middleInitial, contact2.suffix AS c2suffix,  contact2.accredations AS c2accredations, contact2.phone AS c2Phone, contact2.faxNumber AS c2FaxNumber, contact2.mobilePhone AS c2Mobile,  contact2.email AS c2Email, contact2.titleID AS c2Title,  partner.firstName AS c3Firstname, partner.lastName AS c3lastName, partner.middleInitial AS c3middleInitial, partner.suffix AS c3suffix,  partner.accredations AS c3accredations, partner.phone AS c3Phone, partner.faxNumber AS c3FaxNumber, partner.mobilePhone AS c3Mobile,  partner.email AS c3Email, partner.titleID AS c3Title  FROM officelocations_tbl INNER JOIN staff_tbl ON staff_tbl.staffID = officelocations_tbl.contact1 INNER JOIN state_tbl ON state_tbl.stateID = officelocations_tbl.stateID INNER JOIN titles_tbl ON titles_tbl.titleID = staff_tbl.titleID INNER JOIN city_tbl ON city_tbl.cityID = officelocations_tbl.cityID LEFT OUTER JOIN staff_tbl contact1 ON (contact1.staffID = officelocations_tbl.contact1)  LEFT OUTER JOIN staff_tbl contact2 ON (contact2.staffID = officelocations_tbl.contact2)  LEFT OUTER JOIN staff_tbl partner ON (partner.staffID = officelocations_tbl.partner) 

コードの長いセクションで申し訳ありませんが、すべてをインデントするのに1時間かかります。

編集:わかりました。mysqlステートメントを作り直して、データベースからすべての情報を取得できるようにしました。しかし、私はそれに小さな問題があります。ループの3回目の反復ごとに、リスト内の連絡先1とパートナーの場所を切り替えます。そのうちの2つを故障しているようです。したがって、3つの接点がある場合は、contact1とcontact2が切り替わり、2つの接点しかない場合は、それらの順序が切り替わります。

これが私が使用している私の新しいmysqlステートメントです。

    SELECT staff_tbl.staffID, staff_tbl.firstName, staff_tbl.middleInitial, staff_tbl.lastName,
     staff_tbl.suffix, staff_tbl.accredations, staff_tbl.email, staff_tbl.phone,
     staff_tbl.mobilePhone, staff_tbl.officePhone, staff_tbl.faxNumber, staff_tbl.titleID, 
    staff_tbl.locationID, titles_tbl.titleID, titles_tbl.titleName,    
    officelocations_tbl.locationID, officelocations_tbl.officeName, officelocations_tbl.address1,
     officelocations_tbl.address2, officelocations_tbl.cityID, officelocations_tbl.stateID, 
    officelocations_tbl.zipCode, officelocations_tbl.officePhone, officelocations_tbl.contact1,
     officelocations_tbl.contact2, officelocations_tbl.partner, state_tbl.stateID, 
    state_tbl.state_abreviation, state_tbl.state_name, city_tbl.cityID, city_tbl.cityName, 
    officelocations_tbl.contact1 AS c1Contact, officelocations_tbl.contact2 AS c2Contact, 
    officelocations_tbl.partner AS c3Contact FROM staff_tbl INNER JOIN titles_tbl ON 
    titles_tbl.titleID = staff_tbl.titleID INNER JOIN officelocations_tbl ON officelocations_tbl.contact1 = staff_tbl.staffID  OR officelocations_tbl.contact2 = staff_tbl.staffID
      OR officelocations_tbl.partner = staff_tbl.staffID  
    OR staff_tbl.locationID = officelocations_tbl.locationID 
    INNER JOIN state_tbl ON state_tbl.stateID = officelocations_tbl.stateID 
    INNER JOIN city_tbl ON city_tbl.cityID = officelocations_tbl.cityID

私のディスプレイには、contact1、contact2、partnerがあるかどうかを確認するためのifステートメントがあります。連絡先2が空の場合は、連絡先1とパートナーのみが表示され、連絡先2が存在する場合は、3つの連絡先すべてが表示され、elseステートメントはcontact1またはcontact2がない場合はパートナーのみを表示します。これをループするphpは完全に機能するため、エラーは発生しません。エラーの原因となっているのは、まだ完全に正しくないSQLステートメントへの参照および/またはSQLステートメントです。ループごとに、ステートメントの実行を許可し、ステートメントが2番目の(存在する場合)連絡先にヒットしたときに、行を再度フェッチします。変数をstaff_idに設定して、各場所に関連付けられている正しい人をプルできるようにします。行をフェッチする前に、スタッフIDを特定の連絡先の例に設定します。

    $staff_ID == $row_rsOfficeLocation['c3Contact'];

割り当ては正しく読み取られますが、何らかの理由で、スタッフIDへの割り当てを読み取る前にfetchassoc呼び出しがヒットしているようです。スタッフIDをリストの最初の名前ではなく2番目の名前に効果的に設定します。

何か案は?

phpループを含めるように編集します。

    <?php do { 
$staff_ID = $row_myQuery['staffID'];
?>        
    <ul>
              <li><?php echo $row_myQuery['address1']; ?> <?php echo $row_myQuery['address2']; ?></li>
              <li><?php echo $row_myQuery['cityName']; ?>, <?php echo $row_myQuery['state_abreviation']; ?> <?php echo $row_myQuery['zipCode']; ?></li>
              <br />


              <?php
                if ($row_myQuery['c2Contact'] == "" && $row_myQuery['c1Contact'] != ""){?>
                    <!-- if contact 2 is empty display only contact 1 and partner -->

                     <!-- contact 1 information -->  
                     <?php if ($row_myQuery['c1Contact'] != ""){    
                     echo $staff_ID;                      
                         $staff_ID == $row_myQuery['c1Contact'];?>
                        <li class="emailGrey"><strong><?php echo $row_myQuery['firstName']; ?> <?php echo $row_myQuery['middleInitial']; ?> <?php echo $row_myQuery['lastName']; ?> <?php echo $row_myQuery['suffix']; ?></strong></li>
                        <li>Title: <?php echo $row_myQuery['titleName']; ?></li>
                          <li>Tel: <?php echo format_phone($row_myQuery['phone']);?></li>
                          <li>Fax: <?php echo format_phone($row_myQuery['faxNumber']); ?></li>
                          <li><a href="mailto:<?php echo $row_myQuery['email']; ?>">Email: <?php echo $row_myQuery['email'];  echo $row_myQuery['staffID']; ?></a></li>
                          <br />
                       <?php }
                   ?>
                       <?php if ($row_myQuery['c3Contact'] != ""){  

                         $staff_ID == $row_myQuery['c3Contact'];
                         $row_myQuery = mysql_fetch_assoc($myQuery);
                          echo $staff_ID;   ?>

                          <!-- partner information -->  
                          <li class="emailGrey"><strong><?php echo $row_myQuery['firstName']; ?> <?php echo $row_myQuery['middleInitial']; ?> <?php echo $row_myQuery['lastName']; ?> <?php echo $row_myQuery['suffix']; ?></strong></li>
                          <li>Title: <?php echo $row_myQuery['titleName']; ?></li>
                          <li>Tel: <?php echo format_phone($row_myQuery['phone']); ?></li>
                          <li>Fax: <?php echo format_phone($row_myQuery['faxNumber']); ?></li>
                          <li><a href="mailto:<?php echo $row_myQuery['email']; ?>">Email: <?php echo $row_myQuery['email']; ?></a></li>
                     <?php }  ?>




                <?php }else if ($row_myQuery['c2Contact'] != ""){ ?>
                 <!-- if contact 2 is not empty display all contacts -->
                <!-- contact 1 information -->  
                 <?php if ($row_myQuery['c1Contact'] != ""){                          
                 $staff_ID = $row_myQuery['c1Contact'];
                 ?>

                <li class="emailGrey"><strong><?php echo $row_myQuery['firstName']; ?> <?php echo $row_myQuery['middleInitial']; ?> <?php echo $row_myQuery['lastName']; ?> <?php echo $row_myQuery['suffix']; ?></strong></li>
                <li>Title: <?php echo $row_myQuery['titleName']; ?></li>
                  <li>Tel: <?php echo format_phone($row_myQuery['phone']);?></li>
                  <li>Fax: <?php echo format_phone($row_myQuery['faxNumber']); ?></li>
                  <li><a href="mailto:<?php echo $row_myQuery['email']; ?>">Email: <?php echo $row_myQuery['email']; ?></a></li>
                  <br />
                   <?php }
               ?>

              <?php if ($row_myQuery['c2Contact'] != ""){                         
                 $staff_ID = $row_myQuery['c2Contact'];
                 $row_myQuery = mysql_fetch_assoc($myQuery);?>

                <li class="emailGrey"><strong><?php echo $row_myQuery['firstName']; ?> <?php echo $row_myQuery['middleInitial']; ?> <?php echo $row_myQuery['lastName']; ?> <?php echo $row_myQuery['suffix']; ?></strong></li>
                <li>Title: <?php echo $row_myQuery['titleName']; ?></li>
                  <li>Tel: <?php echo format_phone($row_myQuery['phone']);?></li>
                  <li>Fax: <?php echo format_phone($row_myQuery['faxNumber']); ?></li>
                  <li><a href="mailto:<?php echo $row_myQuery['email']; ?>">Email: <?php echo $row_myQuery['email']; ?></a></li>
                  <br />
                   <?php }
               ?>

               <?php if ($row_myQuery['c3Contact'] != ""){  

                 $staff_ID = $row_myQuery['c3Contact'];
                 $row_myQuery = mysql_fetch_assoc($myQuery);
                 ?>

                  <!-- partner information -->  
                  <li class="emailGrey"><strong><?php echo $row_myQuery['firstName']; ?> <?php echo $row_myQuery['middleInitial']; ?> <?php echo $row_myQuery['lastName']; ?> <?php echo $row_myQuery['suffix']; ?></strong></li>
                  <li>Title: <?php echo $row_myQuery['titleName']; ?></li>
                  <li>Tel: <?php echo format_phone($row_myQuery['phone']); ?></li>
                  <li>Fax: <?php echo format_phone($row_myQuery['faxNumber']); ?></li>
                  <li><a href="mailto:<?php echo $row_myQuery['email']; ?>">Email: <?php echo $row_myQuery['email']; ?></a></li>

               <?php }
               ?>       




                <?php } else { ?>
                <!-- if only partner display only partner --> 
               <?php if ($row_myQuery['c3Contact'] != ""){  

                    $staff_ID = $row_myQuery['c3Contact'];
                 ?>

                  <!-- partner information -->  
                  <li class="emailGrey"><strong><?php echo $row_myQuery['firstName']; ?> <?php echo $row_myQuery['middleInitial']; ?> <?php echo $row_myQuery['lastName']; ?> <?php echo $row_myQuery['suffix']; ?></strong></li>
                  <li>Title: <?php echo $row_myQuery['titleName']; ?></li>
                  <li>Tel: <?php echo format_phone($row_myQuery['phone']); ?></li>
                  <li>Fax: <?php echo format_phone($row_myQuery['faxNumber']); ?></li>
                  <li><a href="mailto:<?php echo $row_myQuery['email']; ?>">Email: <?php echo $row_myQuery['email']; ?></a></li>

               <?php }
      } 
     } while ($row_myQuery = mysql_fetch_assoc($myQuery)); ?>
4

2 に答える 2

5

これは初歩的なものINNER JOINです:

SELECT
  titles_tbl.titleID, 
  titles_tbl.titleName
FROM
  titles_tbl 
  JOIN staff_tbl ON titles_tbl.titleID = staff_tbl.titleID 
WHERE
  staff_tbl.titleID = 'some value from your long query'

WHEREこれは、句のサブクエリを使用して実行することもできます。

SELECT
  titles_tbl.titleID, 
  titles_tbl.titleName
FROM
  titles_tbl
WHERE
  titleID = (SELECT titleID FROM staff_tbl WHERE <whatever from your long query>)

または、最初のクエリが1行ではなく複数行を返すことを目的としている場合は、IN()サブクエリを使用する必要があります

/* Replace the WHERE clause above with */
WHERE
  titleID IN(SELECT titleID FROM staff_tbl WHERE <whatever from your long query>)
于 2012-09-26T03:00:49.480 に答える
0

さて、私は自分の質問を理解しました。さらにいくつかのテーブルを作成し、それらをアクセスポイントとして使用して、タイトルと場所の情報を取得しました。すべてのあなたの助けをありがとう:)

他の誰かのためにこれを達成しようとすると、私が使用したsqlステートメントです。

    SELECT 
    staff_tbl.staffID, staff_tbl.firstName, staff_tbl.middleInitial, 
    staff_tbl.lastName, staff_tbl.suffix, staff_tbl.accredations, staff_tbl.email,
    staff_tbl.phone, staff_tbl.mobilePhone, staff_tbl.officePhone, staff_tbl.faxNumber,
    staff_tbl.address1, staff_tbl.address2, staff_tbl.cityID, staff_tbl.stateID, 
    staff_tbl.zipCode, location_tbl.locationID, 
    location_tbl.staffID, officelocations_tbl.locationID, 
    officelocations_tbl.officeName, staff_title_tbl.title_ID, staff_title_tbl.staff_ID,
     titles_tbl.titleID, titles_tbl.titleName, city_tbl.cityID, city_tbl.cityName, 
    state_tbl.stateID, state_tbl.state_abreviation, state_tbl.state_name 

    FROM staff_tbl 

    INNER JOIN location_tbl ON location_tbl.staffID = staff_tbl.staffID 
    INNER JOIN officelocations_tbl ON location_tbl.locationID = officelocations_tbl.locationID
    INNER JOIN staff_title_tbl ON staff_title_tbl.staff_ID = staff_tbl.staffID 
    INNER JOIN titles_tbl ON staff_title_tbl.title_ID = titles_tbl.titleID 
    INNER JOIN city_tbl ON city_tbl.cityID = staff_tbl.cityID 
    INNER JOIN state_tbl ON state_tbl.stateID = staff_tbl.stateID 

ご覧のとおり、私が作成した2つの追加のテーブルはlocation_tblとstaff_title_tblです。これらのそれぞれには、locationID(またはtitleID)用とstaffID用の2つの列があります。これらを使用して、必要なすべての情報を取得することができました。補足として、これには小さな問題がありますが、私はそれをうまく処理していません。スタッフが複数の場所に関連付けられている場合、そのスタッフのまったく同じ情報が複数回表示されます。場所だけが変更されました。しかし、少なくとも私はそれのほとんどがうまくいった。

よろしくお願いします。

于 2012-10-06T20:53:06.153 に答える