0

私はユーザーのデータベースを持っており、名前、住所などのプライマリテーブルがあります。次に、ユーザーの子供、ペット、トレーニングコース、教育結果などの個別のテーブルがあります。

このユーザーの詳細はすべて同じページに表示できます。現在の方法は、最初にデータベースにユーザーのメインの詳細を照会することです。次に、他のテーブルを個別にクエリし、この情報をループで表示します。

私は本当にこれがそれを行うための最良の方法であるかどうか、または単一のクエリでそれを行う方法があるかどうか、そして何か利点があるかどうかを知る必要がありますか?

テーブルの基本構造は次のとおりです。

+----------------+    +-----------------------+
| Users          |    | Children              |
+----------------+    +-----------------------+
|ID |Name |Age   |    |ID |UserRef |Name |Age |
+----------------+    +-----------------------+
|1  |Jim  |53    |    |1  |1       |Joe  |11  |
|2  |Karl |37    |    |2  |1       |Jane |9   |
+----------------+    |3  |2       |Amy  |15  |
                      +-----------------------+

これは基本バージョンであり、ユーザーテーブルと子テーブルのみが表示されます。他のテーブルは、ユーザーテーブルを参照し、1人のユーザーに対して複数のレコードを備えているという点で子テーブルに似ています。

前もって感謝します。

4

2 に答える 2

0

開始するのに適したクエリは次のとおりです。

SELECT * FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef

これにより、「名前」と呼ばれる2つの値が得られることに注意してください。これが、エイリアスを使用する必要がある理由です。

SELECT Users.Name as ParentName, Children.Name as ChildName FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef

上記の形式を使用して、必要な他のフィールドを追加できます。

これを使用する方が良いかどうかについては、どの方法にも長所と短所があります。(多くの小さなクエリとは対照的に)必要なことを実行する、より大きく、より高度なクエリを使用してスクリプトを作成すると、サーバーに1 +(親の数)のクエリが行き来する代わりに、スクリプトの実行が速くなります。クエリは1つだけになります。ただし、クエリが適切に編成されていないと、後で戻ってきたときにデバッグの問題が発生する可能性があり、なぜそれを自分のやり方で行ったかを思い出せません。

于 2012-04-16T14:17:19.107 に答える
0

users.id=children.userrefでテーブルの単純なLEFTJOINを実行できます。ただし、これは1対多の関係であるため、GROUPBYの魔法を使用する必要があります。

  SELECT users.*, GROUP_CONCAT( children.id ORDER BY children.id ASC ) AS childrens_ids, GROUP_CONCAT( children.name ORDER BY children.id ASC ) AS childrens_names, GROUP_CONCAT( children.age ORDER BY children.id ASC ) AS childrens_ages FROM users LEFT JOIN children ON users.id = children.userref GROUP BY children.userref

次に、コードを使用して、子のID、名前、および年齢を解析/展開する必要があります。とはいえ、これは必ずしもあなたがすべきことではありません。MySQL側では必ずしも高速であるとは限りません。また、バックエンドコードで実行する必要のある余分な作業がどれだけあるかがわかります。試してみて、パフォーマンスにどのように影響するかを確認することをお勧めします。

于 2012-04-16T14:26:56.167 に答える