2012-04-16 31 views
0

私は名前、住所などのプライマリテーブルを持つユーザーのデータベースを持っています。次に、ユーザー、子供、ペット、トレーニングコース、教育結果などのテーブルを個別に用意しています。 。MySQL単一のクエリで複数の異なるテーブルからデータを選択

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

これが最善の方法かどうか、または単一のクエリでそれを行う方法があるかどうか、また利点があるかどうかを知る必要があります。

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

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

これは基本的なバージョンであり、唯一のユーザーと子供のテーブルを示しています。他のテーブルは、ユーザーテーブルを参照し、単一のユーザーの複数のレコードを扱うという点で、childrenテーブルと似ています。

ありがとうございます。ここで

+0

あなたの質問をもう少し明確にして、希望の結果を共有してください。 –

+0

これは本当に簡単です。私はあなたが最初にどの列が問題であるか、どの表に属するかを書き留めておくことをお勧めします。次に、最終的な結果表をどのように表示するかの出力を書き留めます。入力と出力を知ることで、目的の出力を与えるSQL文を作成して記述することができます。最初に文を書く前にSQLクエリーにしたいことを正確に知る必要がありますので、すべてが正常に動作するようにしてください。 私の答えをチェックし、どうすればいいのか教えてください – Pavan

答えて

0

ON users.id = children.userrefテーブルの簡単なLEFT JOINを実行できます。しかし、それは1対多の関係であるため、いくつかのGROUP BYマジックを使用する必要があります。

SELECTユーザー。*、GROUP_CONCAT(children.id ORDER BY children.id ASC)AS childrens_ids、GROUP_CONCAT(children。あなたの名前はあなたの名前です。あなたの名前はORDER BYの子孫です.ID ASC)AS childrens_names、GROUP_CONCAT(children.age ORDER BY children.id ASC)AS childrens_agesユーザーからLEFT JOIN children ON users.id = children.userref GROUP BY children.userref

子供のID、名前、年齢を解析/爆発させるためにコードを使用する必要があります。しかし、これは必ずしもあなたがするべきことではありません。 MySQLの最後では必ずしも高速であるとは限らず、バックエンドコードで何をしなければならないかが分かります。私の推薦はそれを試して、それがあなたのパフォーマンスにどのような影響を与えるか見ることです。

+0

私はこれが行く方法だと思います。私は試してみて、それがパフォーマンスにどのような影響を与えるか見てみましょう。 – Sean

0

はで開始するには良いクエリです:これはあなたの「名前」と呼ばれる2つの値を与えること

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

注 - エイリアスを使用する必要がある理由です:

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

することができます上記の形式で必要なフィールドを追加してください。

これを使用するには、の方が良いであるかどうかは、すべての方法に長所と短所があります。多くの小規模なクエリではなく、あなたが望むものを実行する、より大きくより高度なクエリを使用してスクリプトを作成すると、サーバーに戻って1 +(親の数)のクエリが送信されるのではなく、スクリプトがより高速に実行されます。正確に1つのクエリのみになります。しかし、構成の不適切なクエリは、後で復帰したときにデバッグの問題を引き起こす可能性があり、そのようにした理由を覚えていません。

+0

誰がこの理由を教えてください。私はこれが良い反応だと思って、彼はすべての拠点をカバーしました。 – tcole

+0

もう1人のユーザーが落ち込んだ簡潔なコメントをしていたので、それは報復だと思われます。ご協力ありがとうございました。 – Tim

関連する問題