php-順序付けフィールドと欠落フィールドがあるGROUP_CONCAT
次の形式で行を返す一連のテーブルがあります:
3つの関連するテーブルがあります(既存のDB構造を変更することはオプションではありません):
{-code-2}
-組織内のすべての人の表{-code-3}
-学生と教職員の{-code-3}データの表{-code-4}
-{-code-5}スコアのテーブル。各行には個別のスコアが格納されます
これのトリッキーな部分はクイズスコアです。 {-code-5}スコアの行は、学生が{-code-5}を取得した場合にのみ存在します。各{-code-5}
行には{-code-6}
、1〜8があります。したがって、学生の可能な{-code-5}データは(これらはそれぞれ別々の行です):
{-code-2} _id | {-コード-6}|スコア
答え :
{-code-5} zeの一部またはすべてが欠落しているかどうかに関係なく、{-code-5}スコアを8つのコンマ区切り値で適切な順序で返す必要があります。
現在、次のクエリがあります:
SELECT
{-code-2} .id、
ファーストネーム、
苗字、
{-code-9}({-code-4} .score)ASスコア
FROM{-コード-2}
LEFT JOIN {-code-3} ON {-code-2} .id={-code-3}。{-code-2}_id
LEFT JOIN {-code-4} ON {-code-2} .id={-code-4}。{-code-2}_id
どこ
{-code-3} .course_id ='$ num' AND {-code-3} _status_id = 1
GROUP BY {-code-2} .id
ORDER BY last_name
これに関する問題は次のとおりです。
- {-code-5}zesを{-code-6}で並べ替えません
- {-code-5} zeのいずれかが欠落している場合、返される値は少なくなります
したがって、
{-code-9}
スコアには、少なくとも{-code-5}値が欠落している場合はカンマを含め、正しく並べ替える必要があります。私が検討した解決策の1つは、{-code-5}スコアの一時的なテーブルを作成することでしたが、これが最も効率的な方法であるか、正確にどのように実行するかはわかりません。
編集:別の解決策は、クエリを実行して各{-code-5}の存在を個別に確認することですが、これは不格好なようです(1つではなく合計9つのクエリ)。もっとエレガントな方法があることを望んでいました。
これはどのように達成されますか?
答え :
答え :
答え :
解決策:
ここではデータ構造についていくつかの仮定がありますが、これはあなたが求めているものにかなり近いはずです。 GROUP_CONCAT
とCOALESCE
のドキュメントをご覧ください。< / p>
SELECT `person`.`id`、` person`.`first_name`、 `person`.`last_name`、
{-コード-1}(
COALESCE( `tilt`.`quiz`.`score`、'N / A')
ORDER BY `tilt`.`quiz`.`module_id`
)AS`スコア`
FROM`person`
CROSSJOIN`モジュール`
LEFT JOIN `enrollment` USING(` person_id`)
LEFT JOIN `tilt`.`quiz` USING(` person_id`、 `module_id`)
WHERE( `enrollment`.`course_id` ='$ num')
AND( `enrollment`.`enrollment_status_id` = 1)
GROUP BY `person`.`id`
ORDER BY `person`.`last_name`
答え :
解決策:
最初に行うことは、スコアで IFNULL()関数を使用することです
次に、GROUP_CONCAT内でORDERBYを使用します
これが私の提案したクエリです
SELECT
person.id,
first_name,
last_name,
GROUP_CONCAT(IFNULL(tilt.quiz.score,0) ORDER BY tilt.quiz.module) AS scores
FROM person
LEFT JOIN enrollment ON person.id = enrollment.person_id
LEFT JOIN tilt.quiz ON person.id = tilt.quiz.person_id
WHERE
enrollment.course_id = '$num' AND enrollment_status_id = 1
GROUP BY person.id
ORDER BY last_name
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。