0

ここにある約 18 の他の投稿を調べたところ、ほとんどの人がレコードを非表示にするだけでなく削除する方法を尋ねています。だから私の問題:場所に関連付けられているスタッフメンバーのデータベースがあります。多くのスタッフ メンバーは、複数の場所に関連付けられています。私がやりたいことは、mysql の結果にリストされている最初の場所のみを表示し、他の場所をスキップすることです。テーブルをリンクするSQLクエリがあり、他の場所に複数回いるスタッフメンバーに同じ情報を表示する以外に機能するため、例は次のようになります。

ここに画像の説明を入力

これは私が現在持っているSQLステートメントです

    SELECT staff_tbl.staffID, staff_tbl.firstName, staff_tbl.middleInitial, staff_tbl.lastName,
     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

    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 

そして私のphpは

      <?php do { ?>
<tr>
  <td><?php echo $row_rs_Staff_Info['firstName']; ?>&nbsp; <?php echo $row_rs_Staff_Info['lastName']; ?></td>
  <td><?php echo $row_rs_Staff_Info['titleName']; ?>&nbsp; </td>
  <td><?php echo $row_rs_Staff_Info['officeName']; ?>&nbsp; </td>

</tr>
<?php } while ($row_mysqlResult = mysql_fetch_assoc($rs_mysqlResult)); ?>

私が知りたいのは、php を使用して、各人にリストされている最初のエントリのみを選択して表示し、他の 2 つをスキップする方法があることです。スタッフIDを配列に追加することでできると思っていましたが、そこにある場合はstaff_title_tblにリストされている次のものをスキップしますが、そのように書く方法がよくわかりませんでした. 事前に感謝します。

4

3 に答える 3

2

次のように、mysql の DISTINCT を使用できます。

SELECT DISTINCT(staff_tbl.staffID), staff_tbl.firstName, staff_tbl.middleInitial (.. etc)

これが役立つことを願っています

于 2012-10-07T00:06:22.583 に答える
1

のサブクエリを使用して、location_tbl従業員ごとに1つの場所のみを選択できます

SELECT staff_tbl.staffID, 
  staff_tbl.firstName, 
  staff_tbl.middleInitial, 
  staff_tbl.lastName,
  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
FROM staff_tbl 
INNER JOIN
(
  select max(locationID) locationID, staffID
  from location_tbl 
  group by staffID
) 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
于 2012-10-07T00:03:30.883 に答える
0

DISTINCT(staffID) を使用して反復的なスタッフのリストを制限する以外に、クエリで追加のクリーンアップを使用できます。

1) テーブル エイリアスを使用して、各列のテーブル名全体を参照する必要がないようにする

2) SELECT 列のリストに冗長データがあります。

location_tbl. locationID == officelocations_tbl. ロケーションID

staff_tbl. スタッフ ID == location_tbl. スタッフ ID == スタッフ_タイトル_tbl . スタッフ_ID

staff_title_tbl. title_ID == titles_tbl. タイトルID

結合で列を使用するからといって、SELECT ステートメントでその列を参照する必要があるわけではありません。また、これらの列の値が異なる場合、結合ステートメントで 2 つの列をペアにするのは困難です。

3) 矛盾: 本当に staff_title_tbl の名前を変更する必要があります。staff_IDを staffID のみに、および staff_title_tbl に変更します。title_IDを titleID に変更して、他のテーブルの列名と一致させます。以下のクリーンアップされたクエリで、列名が一致する staffID と locationID で USING() を使用する方法に注意してください。ただし、一致しない場合はより長い ON を記述する必要があります。名前に一貫性を持たせて、プログラム内でテーブルを振り返ってどのように名前を付けたかを確認する必要がないようにします。

4) わかりやすくするために INNER JOIN を書き出すこともできますが、他の特定のタイプの結合がリストされていない場合は、これがデフォルトの JOIN タイプであるため、必要に応じて JOIN を使用できます。

SELECT  DISTINCT(s.staffID)
        ,s.firstName
        ,s.middleInitial
        ,s.lastName
        ,l.locationID
        ,ol.officeName
        ,st.title_ID
        ,t.titleName
FROM    staff_tbl           AS s
JOIN    location_tbl        AS l
USING   (staffID)
JOIN    officelocations_tbl AS ol
USING   (locationID)
JOIN    staff_title_tbl     AS st
ON      st.staff_ID = s.staffID 
JOIN    titles_tbl          AS t
ON      st.title_ID = t.titleID

また、参考までに、複数の行を持つ元のクエリを使用して PHP 内でこれを行う方法ですが、$row_rs_Staff_Info というクエリ行セットが 1 か所にあり、$row_mysqlResult があることを考えると、元の PHP がまったく機能することに驚いています。別...

<?php 
$unique = array();
do {
    $key = $row_mysqlResult['firstName'].$row_mysqlResult['lastName'];

    //if ok being last location, newer values will overwrite old for same key
    $unique[$key] = $row_rs_Staff_Info;

    //OR

    //if must be first location, check for key & dont overwrite if already set
    if(!array_key_exists($key, $unique)){
        $unique[$key] = $row_mysqlResult;
    }
} while ($row_mysqlResult = mysql_fetch_assoc($rs_mysqlResult));

foreach($unique as $k => $v){?>
<tr>
  <td><?php echo $v['firstName']; ?>&nbsp; <?php echo $v['lastName']; ?></td>
  <td><?php echo $v['titleName']; ?>&nbsp; </td>
  <td><?php echo $v['officeName']; ?>&nbsp; </td>
</tr>
<?php } ?>

php 配列キーは一意である必要があるため、一意の連結を作成する必要がある値の組み合わせを追加できます。結果に同じキー値が再び表示される場合、そのキーの既存の値が新しい値で上書きされます。ただし、ページ上の他の何かのために大きなデータセットが必要で、2 回クエリを実行したくない場合を除き、使用する予定のないデータのためにサーバー リソースを無駄にしないように、PHP ではなく SQL で最適化してください。

編集

あなたが提供したフィドルリンクからSQLをロードしました.group byは実際に重複したAlexander Walsh行を排除します..

SELECT      s.staffID
            ,s.firstName
            ,s.middleInitial
            ,s.lastName
            ,l.locationID
            ,ol.officeName
            ,st.title_ID
            ,t.titleName
FROM        staff_tbl           AS s
JOIN        location_tbl        AS l
USING       (staffID)
JOIN        officelocations_tbl AS ol
USING       (locationID)
JOIN        staff_title_tbl     AS st
ON          st.staff_ID = s.staffID 
JOIN        titles_tbl          AS t
ON          st.title_ID = t.titleID
GROUP BY    (staffID)

結果 (テーブル幅のために編集されたいくつかの列):

staffID firstName   lastName    officeName      titleName
1       Alexander   Walsh       Seattle         Consultant
2       Bernadette  Ace         Sacramento      Consultant
3       Bert        McElway     San Antonio     Associate Consultant
5       Peter       Wallace     San Francisco   Senior Consultant
于 2012-10-08T03:35:49.620 に答える