如何从Mysql连接3个表来形成网格?

I have been trying every trick I can to accomplish what I am looking for. I am not a noob but I am stuck on this. I am trying to make a "grid" of data from 3 tables. I want it to look like this:

  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  

The first Table columns for members:

Memberid, Username

The assignments table:

 id, title

The grades are kept in subassign :

id,assign,student,grade

assign is the id number of the assignment in the assignments table student is the Memberid from the members table.

I have been looking into this for a couple of days.

The one that gave some results is this query

 $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);

it links the information correctly but I can't get it to display the records like I want. It just creates a new row in php. Can someone please help. I am about to throw my computer out the window.

You can use joins for this like so:

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

Note that if you want to return dynamic columns (which I assume you do) based on the assignments in your table, your best bet would be to dynamically generate a query similar to the above. See below for some very rough example code that would generate a dynamic query that you want (this is wholly untested):

$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 .= "
" . $name . ".grade AS '" . $row['title'] . "',";
    $joins .= "
LEFT 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);

Not 100% sure if I got the query right, but you get the idea:

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

This is basically a pivot of the data but MySQL does not have a pivot. So you can replicate the functionality by using an aggregate function with a CASE similar to this:

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

See SQL Fiddle with Demo

Result:

| 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 |