0

表示ページの 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
4

3 に答える 3

1

SQL

$sql = <<<SQL
SELECT *
FROM TaskInstance
LEFT JOIN Tasks ON fkTkID = TkID
WHERE fkStID = :stID
ORDER BY TkInstOrder 
SQL;

同じだが異なる:

$sql = "SELECT * FROM TaskInstance LEFT JOIN Tasks ON fkTkID = TkID WHERE fkStID = :stID ORDER BY TkInstOrder"; 

:stIDはパラメーターであり、クエリはパラメーター化されたクエリです。SQL インジェクションに対して安全です。mysql_* (非推奨) の代わりに PDO 関数を使用することになります。

これでうまくいくはずだと思います。

于 2013-04-16T00:37:44.610 に答える