2011-11-09 9 views
1

これは本当に一般的な使用例ですが、私はこれを行う最良の方法を知らなかった。私は2つのテーブル別のsql selectでsql selectをネストしていますか?

チームテーブル
を持っていると言う - ID
- チーム名

選手テーブル
- ID
-
をTEAM_ID - PLAYER_NAME

言って、私がしたい出力HTMLに各チームの見出しを表示し、各チームの下にそれぞれのプレーヤー:

チーム1
- ボブ
- JON

チーム2
- 県
- ジェイソン

は以前、私は常にチームのために、そして結果を通してループしながら、SELECTステートメントを使用しました、外部キーが外部クエリの現在の行のIDと等しくなる別の選択ステートメントを実行します。これはダムで非能率的なやり方ですか?このようなことをする標準的な方法は何ですか?私は参加することができましたが、私はチームの見出しを一度だけ表示するためにいくつかのロジックを追加する必要があると思います。私はPHP + MySQLを使用しています。

答えて

2

一般的に、1つの結果セットをループし、ループ内の詳細情報をクエリするのは良い考えではありません。可能であれば、ループ内のデータベースクエリを避けるのが最善です。あなたが提案するように、ここではJOINが動作します:

SELECT team_name,player_name FROM team INNER JOIN players on team.id=players.team_id 

PHPで結果を処理するにはいくつかの方法があります。結果をループして配列に追加することができます。

次に、配列をループして結果を出力できます。 または、db結果を直接ループして、チーム名を格納し、変更時にのみ出力するように出力できます。私は以前のソリューションをお勧めしたいと思います。よりクリーンで抽象的です。

0

2つのオプション、結合またはサブクエリがあります。各結合は、常に別の結合の副問合せに変換できます。

以下のクエリを行うための標準的な方法:全体のチームのテーブルの上に

第1の選択を。

次に、チーム名のxについては の結果をループし、チームごとにteam_id = xという単純なselectを選択します。

サブクエリは必要ありません。コーディングロジックだけです。

+0

私の例と同じ解決策ではありませんか? – eirikrl

+0

そうかもしれませんが、私はそれが最高だと信じています。最適なソリューションは、1つのクエリで必要なものすべてを得ることを意味するわけではありません;)ここでは、結合がなく、サブクエリは必要ありません。問題がn^2の複雑さを持たない場合、それはできません。最初のセットをループする必要があります。そうしないと、データベースは結合またはサブクエリの場合に処理されます。同じ=同じ – Jerome

0

あなたがやっていることは、player_name列を組み立てることです。 SQL 2008R2では、ドットネットフレームワークを使用して記述し、このテクニックを使用するすべてのデータベースで有効にしない限り、集計文字列関数はありません。現在サポートされているすべてのバージョンで動作します

方法 - 2005 +

チームのIDを取得して

(あなたが好きな順序で)名前の文字列を返すユーザー定義関数を作成

その後、関数内の文字列をconconateするに

SELECT team_name, dbo.af_PayerNames(team_ID) Players FROM [Team tabel] 

になって照会

DECLARE @Output VARCHAR(4000) 
SET @Output = '' 
SELECT @Output = @output + ' - ' + COALESCE(Player_Name, '') FROM Players where TeamId = @ param 
「 - 」のみ@output <>「が」

あなたはのparamを渡すことによって、異なる順序でソートするためにあなたの機能を拡張することができたときに追加された10

あなたは、セパレータがいることを保証するために、いくつかの派手なケースロジックを使用することができます。解決策は非常に読みやすいです - おそらくそれを行うサブクエリの方法です - しかし、サブクエリはいつも私の頭を傷つける!関数のアプローチは、非常に大きなテーブルに行く方法ではありません - あなたの脳の確率は傷つけなければなりません。

希望します。