我有三张桌子:
Student - UPN, Name, Year, House
Seclusion_Status - ID, Arrived, FTE, Rebuild, DateTimeAdded, Staff, Student_UPN (fk), Comment
Period_Rating - ID, Slot_ID, Rating, Date, Seclusion_ID (fk)
每个学生可以在Seclusion_Status表中有许多条目,然后Period_rating表中还有许多条目,它们使用Seclusion_ID
链接到Seclusion_status表我正在运行以下查询以根据日期从Seclusion_Status返回记录,然后在Period_rating表中返回与Seclusion_status记录相关的所有记录。
$sql="SELECT * FROM Seclusion_Status
INNER JOIN Students ON Seclusion_Status.Student_UPN=Students.UPN
JOIN Period_Rating ON Seclusion_Status.ID=period_rating.Seclusion_ID
WHERE period_rating.Date = '$start'
ORDER BY Seclusion_Status.DateTimeAdded ASC";
$result=mysql_query($sql);
然后我使用while循环遍历结果:
while($rows=mysql_fetch_array($result)){
然后在表格中显示结果。我遇到的问题是,在period_rating表中有多个条目的情况下,每个学生在不同的行上重复,而不是在同一行上。
这是我用来写出while循环数据的代码:
<tbody>
<tr>
<!--Write out the Student name and year group, and set the colour based on their House/College-->
<?php if($rows['House'] == 'Acer') {
echo '<td width="150px" bgcolor="#003399">' . $rows['Name'] . ' <p>(' . $rows['Year'] . ')</p>' . '</td>';
}else if($rows['House'] == 'Clarus') {
echo '<td width="150px" bgcolor="#FF0000">' . $rows['Name'] . ' <p>(' . $rows['Year'] . ')</p>' . '</td>';
}else if($rows['House'] == 'Fortis') {
echo '<td width="150px" bgcolor="#02A10C">' . $rows['Name'] . ' <p>(' . $rows['Year'] . ')</p>' . '</td>';
}else{
echo '<td width="150px" bgcolor="#D2D904">' . $rows['Name'] . ' <p>(' . $rows['Year'] . ')</p>' . '</td>';
}
?>
<!--Write Out the Staff Name-->
<td><p><?php echo $rows['Staff']; ?> </p></td>
<!--Write out the comment and the incident type in brackets-->
<td width="210px"><p><?php echo $rows['Comment']; ?> (<?php echo $rows['Incident']; ?>) </p></td>
<!--Start writing out the ratings for Period 1-->
<form action="P1Append.php?PrimaryID=<?php echo $rows['PrimaryID']; ?>&startdate=<?php echo $start; ?>" method="post">
<?php
if ($rows['Slot_ID'] == P1)
{
if (empty($rows['Rating']))
{
echo '<td><select onchange="this.form.submit()" style=" width:30px; height:30px;font-size:12pt; background-color:white;" type="text" name="P1" id="P1" maxlength="15" size="1"><option disabled selected></option><option>G</option><option>A</option><option>R</option></td>';
}else if ($rows['Rating'] == G)
{
echo '<td bgcolor="#02A10C">' . $rows['Rating'] . '</td>';
}else if ($rows['Rating'] == A)
{
echo '<td bgcolor="#ff9900">' . $rows['Rating'] . '</td>';
}else if ($rows['Rating'] == R)
{
echo '<td bgcolor="#FF0000">' . $rows['Rating'] . '</td>';
}
}else
{
echo '<td><img src="images\add.png" width="20px"></td>';
}
?>
</form>
<!--Start writing out the ratings for Period 2-->
<form action="P2Append.php?PrimaryID=<?php echo $rows['PrimaryID']; ?>&startdate=<?php echo $start; ?>" method="post">
<?php
if ($rows['Slot_ID'] == P2)
{
if (empty($rows['Rating']))
{
echo '<td><select onchange="this.form.submit()" style=" width:30px; height:30px;font-size:12pt; background-color:white;" type="text" name="P2" id="P2" maxlength="15" size="1"><option disabled selected></option><option>G</option><option>A</option><option>R</option></td>';
}else if ($rows['Rating'] == G)
{
echo '<td bgcolor="#02A10C">' . $rows['Rating'] . '</td>';
}else if ($rows['Rating'] == A)
{
echo '<td bgcolor="#ff9900">' . $rows['Rating'] . '</td>';
}else if ($rows['Rating'] == R)
{
echo '<td bgcolor="#FF0000">' . $rows['Rating'] . '</td>';
}
}else
{
echo '<td><img src="images\add.png" width="20px"></td>';
}
?>
</form>
以下是数据的示例
Students:
UPN | name | House | Year
---------------------------
112 | john | Acer | Year 9
113 | jack | Acer | Year 9
Seclusion_Status:
id | Student_UPN | Arrived | FTE | etc
-----------------------------
1 | 112 | Y | N |
2 | 113 | N | N |
Period_rating:
id | Slot_ID | Rating | Seclusion_ID |
----------------------------------------
1 | P1 | G | 1
2 | P2 | R | 1
3 | P3 | G | 1
目前正在退回的是:
Name | Student_UPN | Slot_ID | Rating
---------------------------------------------
John | 112 | P1 | G
John | 112 | P2 | R
John | 112 | P3 | G
我想要的是:
Name | Student_UPN | P1 Rating | P2 Rating | P3 Rating
---------------------------------------------
John | 112 | G | R | R
希望更有意义吗?
因此,在关联的问题之后,我已将此查询更新为此,但它仍然无效?
$sql="SELECT *
MAX(case when period_rating.Slot_ID = 'P1' THEN Rating ELSE Null END) 'P1',
MAX(case when period_rating.Slot_ID = 'P2' THEN Rating ELSE Null END) 'P2',
MAX(case when period_rating.Slot_ID = 'LF' THEN Rating ELSE Null END) 'LF',
MAX(case when period_rating.Slot_ID = 'BR' THEN Rating ELSE Null END) 'BR',
MAX(case when period_rating.Slot_ID = 'P3' THEN Rating ELSE Null END) 'P3',
MAX(case when period_rating.Slot_ID = 'P4' THEN Rating ELSE Null END) 'P4',
MAX(case when period_rating.Slot_ID = 'LC' THEN Rating ELSE Null END) 'LC',
MAX(case when period_rating.Slot_ID = 'P5' THEN Rating ELSE Null END) 'P5',
MAX(case when period_rating.Slot_ID = 'P6' THEN Rating ELSE Null END) 'P6',
MAX(case when period_rating.Slot_ID = 'DT' THEN Rating ELSE Null END) 'DT'
FROM Seclusion_Status
INNER JOIN Students
ON Seclusion_Status.Student_UPN=Students.UPN
INNER JOIN Period_Rating
ON Seclusion_Status.ID=period_rating.Seclusion_ID
WHERE period_rating.Date = '$start'
GROUP BY Seclusion_Status.Student_UPN
ORDER BY Seclusion_Status.DateTimeAdded ASC";
答案 0 :(得分:0)
您似乎走在正确的轨道上,但是,基于您提供的表格结构,max()函数中的case语句对我来说似乎没有意义:
MAX(case when period_rating.Rating = 'P1' THEN Student END) 'P1'
P1,P2,P3等值似乎在Slot_ID
字段中,而不在评级字段中。
我在表格结构中看不到Student
字段。根据您问题中的说明,您希望在列中返回Rating
字段。
我会在每个案例陈述的else分支中放置一个明确的null
。
总体评论:如果您在输出中的Name
和Student_UPN
字段之后,请将选择列表中的*
替换为这两列,并将其列在分组列表中同样。
答案 1 :(得分:0)
好的,所以我最终通过使用以下查询到达那里:
SELECT seclusion_status.ID, seclusion_status.Arrived, seclusion_status.FTE, seclusion_status.Rebuild, seclusion_status.Text, seclusion_status.DateTimeAdded, seclusion_status.Staff, seclusion_status.Student_UPN, seclusion_status.Incident, seclusion_status.Comment, students.Name, students.UPN, students.Year, students.House, period_rating.ID, period_rating.Slot_ID, period_rating.Rating, period_rating.Date, period_rating.Seclusion_ID,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'P1' THEN period_rating.Rating ELSE NULL END)) AS Period1_Rating,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'P2' THEN period_rating.Rating ELSE NULL END)) AS Period2_Rating,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'LF' THEN period_rating.Rating ELSE NULL END)) AS LF_Rating,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'BR' THEN period_rating.Rating ELSE NULL END)) AS BR_Rating,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'P3' THEN period_rating.Rating ELSE NULL END)) AS Period3_Rating,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'P4' THEN period_rating.Rating ELSE NULL END)) AS Period4_Rating,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'LC' THEN period_rating.Rating ELSE NULL END)) AS LC_Rating,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'P5' THEN period_rating.Rating ELSE NULL END)) AS Period5_Rating,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'P6' THEN period_rating.Rating ELSE NULL END)) AS Period6_Rating,
GROUP_CONCAT((CASE period_rating.Slot_ID WHEN 'DT' THEN period_rating.Rating ELSE NULL END)) AS DT_Rating
FROM Seclusion_Status
INNER JOIN Students
ON Seclusion_Status.Student_UPN=Students.UPN
INNER JOIN Period_Rating
ON Seclusion_Status.ID=period_rating.Seclusion_ID
WHERE period_rating.Date = '$start'
GROUP BY period_rating.Seclusion_ID
ORDER BY Seclusion_Status.DateTimeAdded ASC