表示ページの HTML 出力を伴う MySQL クエリのコンパイルに取り組んでいますが、何らかの方向性を得たいと考えていました。どんな助けでも大歓迎です!
背景: TaskInstance は子であり、Task と Student の両方が親です。TaskInstance テーブルは、学生がタスクにサインアップするたびに増え続けますが、Tasks テーブルの数は有限で、たとえば 20 です。各タスクは Tasks テーブルにあり、いくつかの一般的な性質を持っています。ユーザーはタスクにサインアップできますが、TaskInstance テーブルを使用してタスクに固有の品質を割り当てることができます。TaskInstance 変数には次のものが含まれます。
- TkInstanceInfoA、TkInstanceInfoB、TkInstanceInfoC、TkInstanceInfoD では、さまざまな記述などが可能です。
- TkInstanceSide は、タスクが右側で行われるか、左側で行われるか、または側がない場合 (L、R、または null) を示します。
- fkTkID は、どの Task が TaskInstance の親であるかを示します
- fkStID は、どの Student が TaskInstance の親であるかを示します
データベース:
Students
1.) StID
2.) StNameFirst
3.) StNameLast
4.) StGender
5.) StPasscode
6.) fkProID
Tasks
1.) TkID
2.) TkSide (the task by nature has a side?: Y or N)
3.) TkImgML
4.) TkImgMR
5.) TkImgMC
6.) TkImgFL
7.) TkImgFR
8.) TkImgFC
9.) TkTitleSci
10.) TkTitleCom
11.) TkDesc
TaskInstance
1.) TkInstID
2.) TkInstSide (which side is the task?: L, R or null)
3.) TkInstInfoA
4.) TkInstInfoB
5.) TkInstInfoC
6.) TkInstInfoD
7.) TkInstCustomTitleSci
8.) TkInstCustomTitleCom
9.) TkInstCustomDesc
10.) TkInstOrder
11.) fkTkID
12.) fkStID
MySQL:
更新: 2013 年 4 月 16 日午後 12:03 EST: SELECT AND SELECT CASE を逆にして、カンマがありませんでした。現在は修正されていますが、まだ壊れています:
$CurrentStID = 1; // known previously
$CurrentStGender = M; // known previously
SELECT *,
CASE StGender
WHEN 'M' THEN
CASE IFNULL(TkInstSide, 'C')
WHEN 'L' THEN TkImgML
WHEN 'R' THEN TkImgMR
ELSE TkImgMC
END
WHEN 'F' THEN
CASE IFNULL(TkInstSide, 'C')
WHEN 'L' THEN TkImgFL
WHEN 'R' THEN TkImgFR
ELSE TkImgFC
END
END TkImgCase,
CASE StTitlePref
WHEN 'Common' THEN
CASE WHEN TkInstCustomTitleCom IS NULL
THEN TkTitleCom
ELSE TkInstCustomTitleCom
END
WHEN 'Scientific' THEN
CASE WHEN TkInstCustomTitleSci IS NULL
THEN TkTitleSci
ELSE TkInstCustomTitleSci
END
END TkTitleCase
FROM TaskInstance
LEFT JOIN Tasks ON fkTkID = TkID
LEFT JOIN Students ON fkStID = StID
WHERE fkStID = $CurrentStID
ORDER BY TkInstOrder
印刷:
1.) カスタムのタイトルと説明を確認します。それ以外の場合は、標準を使用します。
更新: 2013 年 4 月 16 日午前 11 時 52 分 EST:カスタム タイトルに夢中です。私の調整はうまくいくはずですか?失敗しているようです。
if ($row['StTitlePref'] == "Common") && (strlen(trim($row['TkInstCustomTitleCom'])) > 0) { $TkTitle = $row['TkInstCustomTitleCom'] } // will be default or custom
else if ($row['StTitlePref'] == "Scientific") && (strlen(trim($row['TkInstCustomTitleSci']) > 0) { $TkTitle = $row['TkInstCustomTitleSci'] } // will be default or custom
2.) 6 つの画像から 1 つを選択します。
MySQL を使用して性別を使用して 6 つの画像のうち 3 つを除外し、後で PHP if/then を使用して残りの 3 つの画像のうち 1 つを選択するのは良いことですか?
学生の性別 (StGender) が男性で、タスクに側面 (TkSide) がある場合は、正しい画像を表示します。L 側 (TkInstanceSide) の場合、L 男性の画像 (TkImgML) を表示します。R 側 (TkInstanceSide) の場合、R の男性イメージ (TkImgMR) を表示します。生徒の性別 (StGender) が男性で、タスクに側面 (TkSide) がない場合 [TkInstanceSide も null]、中央の男性の画像 (TkImgMC) を表示します。
学生の性別 (StGender) が女性で、タスクに側面 (TkSide) がある場合は、正しい画像を表示します。L 側 (TkInstanceSide) の場合、L 女性の画像 (TkImgFL) を表示します。R 側 (TkInstanceSide) の場合、R の女性のイメージ (TkImgFR) を表示します。生徒の性別 (StGender) が女性で、タスクにサイド (TkSide) がない場合 [TkInstanceSide も null]、中央の女性の画像 (TkImgFC) を表示します。
3.) このインスタンスに関連する追加情報を表示します。
次の 4 つの変数を表示します: TkInstanceInfoA、TkInstanceInfoB、TkInstanceInfoC、TkInstanceInfoD。
したがって、最終的には次のようになります。
echo ‘<p>’ . $TkTitleCom . ‘<br>’; // show either standard title or custom title
echo $TkDesc . ‘<br>’; // show either standard description or custom description
echo $TkInstanceInfoA . ‘<br>’;
echo $TkInstanceInfoB . ‘<br>’;
echo $TkInstanceInfoC . ‘<br>’;
echo $TkInstanceInfoD . ‘<br>’;
echo $CorrectImg . ‘</p>’; // show either TkImgML, TkImgMR, TkImgMC, TkImgFL, TkImgFR or TkImgFC
2013 年 4 月 18 日: フォローアップの質問 (同様)
親愛なるバーマー: お世話になり、誠にありがとうございます。少し時間があれば、フォローアップの質問があります。Tasks テーブルから (以前のように TaskInstance テーブルからではなく) プルしようとしている表示ページがあります。
以前のクエリから $CurrentStGender と $CurrentStTitlePref を知っています。CASE ステートメントを使用して、正しい画像 (1/6) と正しいタイトル設定を選択したいと考えています。2 つの既知の変数を SQL に与える方法を理解するのに苦労しています。手伝ってくれますか?
// echo $CurrentStGender . ', ' . $CurrentStTitlePref;
if ($result = $mysqli->query("
SELECT *,
CASE CurrentStGender
WHEN 'M' THEN
CASE WHEN TkSide == 'Y' THEN TkImgML /* if task can be done on a side, show just the L-side
ELSE TkImgMC
END
WHEN 'F' THEN
CASE WHEN TkSide == 'Y' THEN TkImgFL /* if task can be done on a side, show just the L-side
ELSE TkImgFC
END
END TkImgCase,
CASE StTitlePref
WHEN 'Common' THEN TkTitleCom
END
WHEN 'Scientific' THEN TkTitleSci
END
END TkTitleCase
FROM Tasks