2016-11-03 8 views
1

私はプロジェクトのためにPHPとMySQLを学習しており、この部分で苦労しています。わかりやすくするために、関連するフィールド(実際にはもっと多くの実際のデータベース)をリストにして、3つのテーブルがあるとします。MySQLとPHP 1対多のデー​​タを1行、複数の列に返す

Table1 
--------------------- 
Index | Name | email 
1  | Rob | [email protected] 
2  | Kevin| [email protected] 
3  | Amy | [email protected] 

Table2 
------------------------ 
id | Info | Submitted 
1  | Blah | 0 
2  | Yada | 1 

Table 3 
------------------------- 
id | Goal |Submitted 
1  | 1 | 1 
1  | 2 | 1 
1  | 3 | 1 
1  | 4 | 0 
1  | 5 | 0 
3  | 1 | 0 
3  | 3 | 1 
3  | 4 | 1 

ので、表1には、ユーザー情報を保持し、ちょっとメインテーブル

表2ユーザーがフィールドにいくつかのデータを入力して、準備ができたときに、承認のために提出されます。 (私は後で関数にSubmittedの値を使用します) ユーザーが情報を送信していない場合、レコードはありません。これは、表1と1対1です。表3ユーザは5つの目標について情報を入力します。任意の時点で、ユーザーに0〜5つのゴールが入力されることがあります。 Submittedは後の処理でも同じです。この表はTable1と多対1です。目標フィールドには1〜5の数字が表示されますが、この例では不要な目標テキストを保持する別のフィールドがあります。

所望の出力はHTMLテーブル

Name | email   | info |Goal1|Goal2|Goal3|Goal4|Goal5| 
Rob | [email protected] | Blah | 1 | 2 | 3 | 4 | 5 | 
Kevin | [email protected] | Yada |  |  |  |  |  |    
Amy | [email protected] |  | 1 |  | 3 | 4 |  | 

ブランクがNULLと考えたり、彼らがDBに存在しないと他の何かされているかどうかわからないです。私は*のようなフィールドに何かを入れたいと思います。基本的には、Submittedはフィールドのハイパーリンクを作るためのコードに使われるので、テーブル表示ではなくクエリの一部である必要がありますが、役立つならば表示することができます。私は左にクエリを使用しています

Name | email   | info |Goal1|Goal2|Goal3|Goal4|Goal5| 
Rob | [email protected] | Blah | 1 | 2 | 3 | 4 | 5 | 
Kevin | [email protected] | Yada | * | * | * | * | * | 
Amy | [email protected] | * | 1 | * | 3 | 4 | * | 

が加わり、GROUP_CONCAT、それは非実在データとうまく動作していない、と私はいくつかのクレイジーな連結を行わずに送信されたフィールドを含める方法を見つけ出すことはできません、その後で引っ張っすべて離れてHTMLフィールドに入れてください。

私はいくつかのコードを含めることができますが、多くの変数が使用されているので、従うのが難しいかもしれません。

私はTABLE1と表3を用いて得ている最高: ロブ1,2,3,4,5 ケビン エイミー1,3,4

できない入力されていないレコードを持ちますこれは、データ文字列をテーブルに変換することは不可能に近くなります。私はすべての位置に何かを表示することができます、まだ存在しない場合でも、私はHTMLテーブルにそれを作る方法を知っています。

これは意味があり、誰かが私を助けてくれることを望みます。

+1

現在のところ、このソリューションは非常に多くあります。メインのクエリやクエリを投稿したり、擬似コードを使用して特定の質問がどこにあるかを説明したりできますか? – WEBjuju

+0

あなたは何を試しましたか?メインのSQLクエリ –

答えて

0

あなたは最大で5つの目標があると述べました。可能な最良のオプションは、次のクエリを使用することです。

SELECT t1.Name,t1.email 
,CASE WHEN t2.Info IS NULL THEN * ELSE t2.Info END as Info 
,CASE WHEN g1.Goal IS NULL THEN * ELSE g1.Goal END as Goal1 
,CASE WHEN g2.Goal IS NULL THEN * ELSE g2.Goal END as Goal2 
,CASE WHEN g3.Goal IS NULL THEN * ELSE g3.Goal END as Goal3 
,CASE WHEN g4.Goal IS NULL THEN * ELSE g4.Goal END as Goal4 
,CASE WHEN g5.Goal IS NULL THEN * ELSE g5.Goal END as Goal5 
FROM Table1 as t1 
    LEFT JOIN Table2 as t2 ON t2.id = t1.Index 
    LEFT JOIN Table3 as g1 ON g1.id = t1.Index AND g1.Goal=1 
    LEFT JOIN Table3 as g2 ON g2.id = t1.Index AND g2.Goal=2 
    LEFT JOIN Table3 as g3 ON g3.id = t1.Index AND g3.Goal=3 
    LEFT JOIN Table3 as g4 ON g4.id = t1.Index AND g4.Goal=4 
    LEFT JOIN Table3 as g5 ON g5.id = t1.Index AND g5.Goal=5 
+0

ありがとうございました!これは素晴らしい作品です。ちょうど参考のために、*は働くために引用する必要がありますので、 '*'。さて、提出されたフィールドについての質問です。各ゴールについて、それが提出された場合(提出された値= 1)、どのようにしてゴールナンバーを「S」に置き換えることができますか? –

+0

私は提示されたデータを変更するために提出された値をどのように使用するかを理解することができました。サンプル行は以下の通りです: 、gASEがGOLDである場合はNULLです。g1.Submitted = 1 Then 'S' ELSE g1.Goal End as Goal1 –

0

それぞれのテーブルを一緒にジョインし、GROUP BYを使用したいと思うでしょう。

目標を処理する1つの方法は、すべての目標を含む1つの列として表示することです。

これは、あなたが始めるのに役立つはずです。

SELECT name, 
     email, 
     info, 
     <LOGIC> as goals 
FROM table1 
JOIN table2 ON table2.user_id = table1.id 
JOIN table3 ON table3.user_id = table1.id 
GROUP BY name 

あなたは目標が定義されている場合、文字列にそれを連結(CASEおよびCONCATの混合物を使用して作成することができ、目標の欄に使用するロジックを、その文字列を目標の最終値として表示します)。

+0

を共有してください。ここで列名を取得するのは 'goal1、goal2、goal3'です。 –

関連する問題