我正在使用显示页面的随附HTML输出来编译MySQL查询,但希望能获得一些指导。 任何帮助将非常感激!

背景: TaskInstance是孩子,而Task和Student都是父母。 每当学生报名参加一项任务时,TaskInstance表将不断增长,但是Tasks表的数量有限,例如20。每个任务都位于Tasks表中,并且具有一定的通用性。 用户可以注册任务,但是可以使用TaskInstance表将唯一的质量分配给任务。 TaskInstance变量包括:

  • TkInstanceInfoA,TkInstanceInfoB,TkInstanceInfoC,TkInstanceInfoD允许进行各种描述等。
  • TkInstanceSide指示任务是在右侧,左侧还是在左侧(L,R或null)完成
  • fkTkID告诉我们哪个Task是TaskInstance的父级
  • fkStID告诉我们哪个学生是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:我的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:我一直挂在自定义标题上。 我的调整应该可以吗? 它似乎失败了。

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.)从六个图像中选择一个图像:

使用MySQL使用性别消除6张图像中的3张,然后再使用PHP(如果/然后选择其余3张图像中的1张),是否很好?

如果学生的性别(StGender)是男性,并且任务有侧面(TkSide),则显示正确的图像:如果L侧面(TkInstanceSide),则显示L男性图像(TkImgML); 如果是R侧(TkInstanceSide),则显示R男性图像(TkImgMR)。 如果学生的性别(StGender)是男性,并且任务没有侧面(TkSide)[TkInstanceSide也为空],则显示中心男性图像(TkImgMC)。

如果学生的性别(StGender)是女性,并且任务有侧面(TkSide),则显示正确的图像:如果L侧面(TkInstanceSide),则显示L女性图像(TkImgFL); 如果是R侧(TkInstanceSide),则显示R母图像(TkImgFR)。 如果学生的性别(StGender)是女性,并且任务没有侧面(TkSide)[TkInstanceSide也为空],则显示中心女性图像(TkImgFC)。

3.)显示与此实例相关的其他信息:

显示这四个变量: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语句来选择正确的图像(6之1)和正确的标题首选项。 我很难确定如何将我的两个已知变量传递给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

===============>>#1 票数:1

(1)列印

if (strlen(trim($TkInstCustomTitleCom)) > 0) $tkTitleCom = $tkInstCustomTitleCom;
echo $tkTitleCom; // will be default or custom

(2)列印

试试这个代替if ... else ; (括号中)的表达式称为ternary operator ,第2行中的表达式是一个variable variable

$image = "TkImg" . $StGender . ($TkSide=='Y'?$TkInstanceSide:'C');
$imagename = $$image; // now $imagename contains the content of e.g. $TkImgMC 

看到它的工作原理http : //codepad.viper-7.com/abpxbU

===============>>#2 票数:1 已采纳

您可以在SQL中根据性别和侧面选择图片:

SELECT *, 
       CASE StGender
           WHEN 'M' THEN
               CASE IFNULL(TkSide, 'C')
                    WHEN 'L' THEN TkImgML
                    WHEN 'R' THEN TkImgMR
                    ELSE TkImgMC
               END
           WHEN 'F' THEN
               CASE IFNULL(TkSide, 'C')
                    WHEN 'L' THEN TkImgFL
                    WHEN 'R' THEN TkImgFR
                    ELSE TkImgFC
               END
       END TkImg
FROM TaskInstance 
LEFT JOIN Tasks ON fkTkID = TkID 
LEFT JOIN Students ON fkStID = StID
WHERE fkStID = $CurrentStID 
ORDER BY TkInstOrder

后续答案:

您可以通过两种方式执行此操作。 一种是保留当前的两级CASE结构,但用用PHP变量填充的文字替换列名称(CASE语句中允许使用任何表达式,因此文字与列名称一样好) :

CASE '$CurrentStGender'
   WHEN 'M' THEN ...
   WHEN 'F' THEN ...
END TkImgCase,
CASE '$CurrentStTitlePref'
    WHEN 'Common' THEN TkTitleCom 
        END
    WHEN 'Scientific' THEN TkTitleSci 
        END
END TkTitleCase

另一个优点是您的列遵循命名约定,因此您可以直接插值到列名称中:

$titleAbbrev = substr($CurrentStTitlePref, 0, 3);
if ($result = $mysqli->query("
  SELECT *,     
     CASE WHEN TkSide == 'Y' THEN TkImg{$CurrentStGender}L
          ELSE TkImg{$CurrentStGender}C
     END TkImgCase,
     TkTitle{$titleAbbrev} TkTitleCase
  FROM Tasks");

===============>>#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注入是安全的。 您将使用PDO函数而不是mysql _ *(已弃用)。

我认为这应该可以解决问题。

  ask by webdude77 translate from so

未解决问题?本站智能推荐: