2013-01-03 47 views
2

我一直在想尽一切办法来完成我所需要的。我不是一个noob,但我坚持这一点。 我想从3个表格中创建一个“网格”数据。我希望它看起来像这样:如何从Mysql连接3个表格以形成网格?

Assignments | Assgn 1 | Assgn 2 | Assgn 3 | Assgn 4 | Final Grade 
---------------------------------------------------------------------- 
    Username 1 | Grade | Grade | Grade | Grade | Total 
---------------------------------------------------------------------- 
    Username 2 | Grade | Grade | Grade | Grade | Total 
---------------------------------------------------------------------- 
    Username 3 | Grade | Grade | Grade | Grade | Total 

第一个表列成员:

Memberid, Username 

的分配表:

id, title 

的成绩都保持在subassign:

id,assign,student,grade 

assign是id nu在作业表中的作业的更多 学生是成员表中的Memberid。

我一直在寻找这一两天。

这给了一些成果的一个是这样的查询

$result = mysql_query("SELECT assignments.title,subassign.grade, members.Username FROM assignments, subassign, members WHERE members.Memberid = subassign.student and assignments.id = subassign.assign ",$connect); 

它正确链接的信息,但我不能让它显示的记录,像我想要的。它只是在php中创建一个新行。有人可以请帮助。我即将把我的电脑扔出窗外。

+0

不知道,但也许它不是明智的做法是使用MySQL任何更多可能想要转换为MYSQLi – Sir

回答

1

您可以使用加入这个像这样:

SELECT 
    members.title AS 'Assignments', 
    assignment1.grade AS 'Assign1', 
    assignment2.grade AS 'Assign2', 
    assignment3.grade AS 'Assign3', 
    assignment3.grade AS 'Assign4' 
FROM members 
INNER JOIN subassign AS assignment1 ON assignment1.person = members.MemberId AND assign = 1 
INNER JOIN subassign AS assignment2 ON assignment2.person = members.MemberId AND assign = 2 
INNER JOIN subassign AS assignment3 ON assignment3.person = members.MemberId AND assign = 3 
INNER JOIN subassign AS assignment4 ON assignment4.person = members.MemberId AND assign = 4 

需要注意的是,如果你想返回基于表格中的assignments动态列(我认为你这样做),你最好的选择将是动态生成类似上面的查询。请参阅下面的一些非常粗略的示例代码,将生成需要动态查询(这是完全未经测试):

$results = mysql_query("SELECT id, title FROM assignments"); 
$query = "SELECT 
    members.title AS 'Assignments',"; 

$joins = ""; 

while($row = mysql_fetch_assoc($results)) 
{ 
    $name = 'assignment' . $row['id']; 
    $query .= "\r\n" . $name . ".grade AS '" . $row['title'] . "',"; 
    $joins .= "\r\nLEFT JOIN subassign AS " . $name . " ON " . $name . ".person = members.MemberId AND " . $name . ".assign = " . $row['id']; 
} 

$query = substr($query, 0, -1) . " FROM members" . $joins; 
$result = mysql_query($query); 
0

不是100%肯定,如果我得到了查询的权利,但你的想法:

SELECT 
    a.title, 
    s.grade, 
    m.Username 
FROM 
    members m 
LEFT JOIN 
    subassign AS s ON s.student = m.Memberid 
LEFT JOIN 
    assignments AS a ON a.id = s.assign 
+0

好的,谢谢你让他们现在正确列表,但它会为每个任务创建一个新行。现在一个愚蠢的问题,我将如何做到这一点,布局会像我想要的?我对这方面的数据并不熟悉 – Tattedman

0

这基本上是数据的支点但MySQL没有一个支点。所以,你可以通过使用聚合函数类似下面的CASE复制功能:

select m.username as assignments, 
    max(case when s.assign = 1 then s.grade end) Assign1, 
    max(case when s.assign = 2 then s.grade end) Assign2, 
    max(case when s.assign = 3 then s.grade end) Assign3, 
    max(case when s.assign = 4 then s.grade end) Assign4, 
    avg(s.grade) FinalGrade 
from members m 
left join subassign s 
    on m.memberid = s.student 
left join assignments a 
    on s.assign = a.id 
group by m.username 

SQL Fiddle with Demo

结果:

| ASSIGNMENTS | ASSIGN1 | ASSIGN2 | ASSIGN3 | ASSIGN4 | FINALGRADE | 
-------------------------------------------------------------------- 
| username 1 |  50 |  68 |  32 |  68 |  54.5 | 
| username 2 |  75 |  86 |  89 |  36 |  71.5 | 
| username 3 |  99 |  70 |  24 |  100 |  73.25 |