2016-11-13 8 views
4

似たような質問があればお詫び申し上げます。私がやりたいことは、データベース内のいくつかの行を選択し、それらをフェッチすることですが、一意の行に基づいてグループにエコーします。私は(私は簡潔にするためにいくつかのことを省略している)の例で説明しましょう:MySQL固有の値を持つエコーグループPHP

私はこのような選択クエリがあります。今

SELECT 
    e.exercisename ExerciseName, 
    eh.reps Reps, 
    eh.weight Weight 
FROM workouts w 
JOIN users u ON w.userid = u.id 
JOIN workouts_history wh ON w.id = wh.workoutid 
JOIN exercises e ON wh.exerciseid = e.id 
JOIN exercises_history eh ON wh.id = eh.workouts_historyid 

を、これは私にこの中のオフに基づいてテーブルを与える:

このようになります
while($workoutrowridge = $workoutresultridge->fetch_assoc()) { 
    $workoutoutputridge .= '<tr>'; 
     $workoutoutputridge .= '<td>'.$workoutrowridge['ExerciseName'].'</td>'; 
     $workoutoutputridge .= '<td>'.$workoutrowridge['Reps'].'</td>'; 
     $workoutoutputridge .= '<td>'.$workoutrowridge['Weight'].'</td>';    
    $workoutoutputridge .= '</tr>'; 
} 

:私は起こるしたい何

Exercise | Reps | Weight 
--------------------------- 
Squats  | 8 | 135 
Squats  | 8 | 225 
Squats  | 6 | 315 
Squats  | 2 | 405 
Squats  | 1 | 485 
Bench (DB) | 8 | 60 
Bench (DB) | 6 | 80 
Bench (DB) | 4 | 90 
Bench (DB) | 2 | 95 
Pullup  | 4 | 0 
Pullup  | 3 | 25 
Pullup  | 1 | 45 
Pullup  | 1 | 70 

、hにあります一意の「ExerciseName」ごとに新しいテーブルをエコーし​​ます(たとえば)。ワークアウトはわずか1運動を有していてもよく、またはそれはこのように、一つ一つのためのセットの異なる量で、20を持っていることがあります。

Exercise | Reps | Weight 
--------------------------- 
Squats  | 8 | 135 
Squats  | 8 | 225 
Squats  | 6 | 315 
Squats  | 2 | 405 
Squats  | 1 | 485 

Exercise | Reps | Weight 
--------------------------- 
Bench (DB) | 8 | 60 
Bench (DB) | 6 | 80 
Bench (DB) | 4 | 90 
Bench (DB) | 2 | 95 

私は1つのクエリとしてこれを維持する方法があるように感じる、とだけこれを行うにはPHPでforeachのいくつかの型を使用してください...しかし、私はこれを得ることができませんでした。助言がありますか?

答えて

4

を、私は数行を追加します

<table>なし
$lastExercise = ""; // my edit 
while($workoutrowridge = $workoutresultridge->fetch_assoc()) { 
    if($workoutrowridge['ExerciseName'] != $lastExercise){ 
     $workoutoutputridge .= "<tr><td>Exercise</td><td>Reps</td><td>Weight</td></tr>"; 
    } 
    $lastExercise = $workoutrowridge['ExerciseName']; 

//the rest is your original code 
    $workoutoutputridge .= '<tr>'; 
     $workoutoutputridge .= '<td>'.$workoutrowridge['ExerciseName'].'</td>'; 
     $workoutoutputridge .= '<td>'.$workoutrowridge['Reps'].'</td>'; 
     $workoutoutputridge .= '<td>'.$workoutrowridge['Weight'].'</td>';    
    $workoutoutputridge .= '</tr>'; 
} 
+2

それは良い解決です、ありがとう。私はそれが最初の応答だったので、他の答えを正しいものとして受け入れるつもりです。しかし、私はまだあなたにこの答えに対する投票を与えます。 –

+0

@RidgeRobinsonそれは大丈夫です私はちょうど助けたいと思っていました、あなたは礼儀正しくです:)はい、彼の答えはmienの前に来ます:) –

4

あなたはこのような何かを行うことができ:クエリの結果は、これはあなたのループである

このように私はそれを行うだろう ExerciseNameによってソートされている場合

$currentExercise = ''; 
echo '<table>'; 
while($workoutrowridge = $workoutresultridge->fetch_assoc()) { 
    if($currentExercise !== '' && $workoutoutputridge['ExerciseName'] !== $currentExercise) { 
     echo '</table><table>'; 
    } 
    $workoutoutputridge .= '<tr>'; 
    $workoutoutputridge .= '<td>'.$workoutrowridge['ExerciseName'].'</td>'; 
    $workoutoutputridge .= '<td>'.$workoutrowridge['Reps'].'</td>'; 
    $workoutoutputridge .= '<td>'.$workoutrowridge['Weight'].'</td>'; 
    $workoutoutputridge .= '</tr>'; 

    $currentExercise = $workoutrowridge['ExerciseName']; 
} 
echo '</table>'; 
+1

を。なぜ私はそれを考えなかったのか分かりません...もっと複雑にしようとしていましたが、時には簡単な方法が最高です! –

+0

はい、演習の名前の別のサブレベルで新しい配列を作成することもできました – Max

2

[編集] あなたがどんな運動をしていない場合は


きれいな何かのためにあなたはこれを使用することができますので、簡単な素晴らしいソリューション...だ

$currentEx = false; 

while($workoutrowridge = $workoutresultridge->fetch_assoc()) { 

    if(!$currentEx) // first round 
     $workoutoutputridge .= "<table>\n"; 
    else if($currentEx AND $workoutrowridge['ExerciseName'] != $currentEx){ 
     $workoutoutputridge .= "</table>\n"; 
     $workoutoutputridge .= "<table>\n"; 
     $currentEx = $workoutrowridge['ExerciseName']; 
    } 

    $workoutoutputridge .= "<tr>\n"; 
    $workoutoutputridge .=  "<td>".$workoutrowridge['ExerciseName']."</td>\n"; 
    $workoutoutputridge .=  "<td>".$workoutrowridge['Reps']."</td>\n"; 
    $workoutoutputridge .=  "<td>".$workoutrowridge['Weight']."</td>\n";   
    $workoutoutputridge .= "</tr>\n"; 

} 

if($workoutoutputridge) 
    $workoutoutputridge .= "</table>\n"; 
+0

* "何かクリーンでこれを使うことができます" * - 実際には、 "クリーナー" HTMLソースが1行に1つの大きなコードとして見えるようにして、それぞれの要素がクリーンなHTMLを生成した後に '' \ n "'を追加するのを避けてください。 (HTML)ソースを使ってデバッグしなければならない場合には、価値ある方法です;-) HTMLソースを使用することは、(web)開発における「ツール」と同じです。 –

+0

@ Fred-ii- space、\ tと\ nはネットワーク上の領域を占有しますが、デバッグツールは自動的にインデントされ、 "クリーンなHTML"を心配するとクリーンなPHPファイルでは役に立たない、googleを見てくださいソースコードXD。しかし、最後に '。" \ n "'を入れることができます。 – Blag

+0

* "どのデバッグツールでも自動インデントを行う" * - 自分自身はブラウザのデバッグツールに依存しません。彼らは良い、私を間違って取得しないでください。しかし、誰かが掻き出しからソースをつかみたいと言うと、それは別の話です。私は常に、すべてのコードに\ n ""を追加します。 –

関連する問題