0

、、、およびという3つのテーブルがusersあります。facilitiesstaff_facilities

usersusers.id平均的なユーザーデータが含まれています。私の場合、最も重要なフィールドは、、、users.firstですusers.last

facilitiesまた、かなりの量のデータが含まれていますが、を除いて、必ずしもこの例に関連するものではありませんfacilities.id

staff_facilties(int、 auto_inc staff_facilities.id、NOT NULL)、staff_facilities.users_id(int、NOT NULL)、およびstaff_faciltities.facilities_id(int、NOT NULL)で構成されます。(それは一口です!)

staff_facilities他の2つのテーブルのIDを参照し、このテーブルを呼び出してユーザーの施設と施設のユーザーを検索します。

これは、PHPでの私の選択クエリです。

SELECT users.id, users.first, users.last FROM staff_facilities LEFT JOIN users ON staff_facilities.users_id=users.id WHERE staff_facilities.facilties_id=$id ORDER BY users.last

このクエリは開発サーバーではうまく機能しますが、クライアントの本番環境にドロップすると、結果セットに空白行が表示されることがよくあります。私たちの開発サーバーは、クライアントの本番サーバーにすでに存在する複製されたテーブルとデータを使用していますが、ハードウェアとソフトウェアはかなり異なります。

これらの行には、データベースにNOTNULL値を入力する必要がある3つのidフィールドを含む情報がありません。バックエンドでMySQL管理ツールを使用してクエリを実行すると、同じ結果が返されます。テーブルでNULLフィールドを検索しても、何も見つかりませんでした。

もう1つの奇妙な点は、WHERE句のIDチェックによって生じるさまざまな結果に基づいて、空の行の数が変化していることです。通常、空の行は1〜3行程度ですが、同じパラメーターを使用すると一貫性があります。

LEFT JOINSが原因でほぼ重複する行が返されることに何度も対処しましたが、これまでにこれが発生したことはありません。情報を表示する限り、エンドユーザーから簡単に隠すことができます。私の懸念は、主に、時間が経過し、レコードの数が増えるにつれて、この問題が悪化することです。現状では、このシステムはインストールされたばかりであり、すでに2000以上のレコードがstaff_facilitiesテーブルにあります。

任意の洞察や方向性をいただければ幸いです。さらに詳細な例と情報も提供できます。

4

1 に答える 1

4

結合の右側にあるテーブルからのみ列を選択しています。もちろん、それらのいくつかは完全にnullです、あなたは左結合をしました。したがって、これらのレコードは、結合の左側にあるテーブルのIDと一致しますが、結合の右側にあるデータとは一致しません。左側のテーブルから列を返さないため、データは表示されません。

于 2009-06-26T18:51:22.507 に答える