2

私は自分が探しているものを達成するためにできる限りのトリックを試してきました. 私は初心者ではありませんが、これにこだわっています。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 番号です。 student は、メンバー テーブルの 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で新しい行を作成するだけです。誰か助けてください。パソコンを窓から投げ捨てようとしています。

4

3 に答える 3

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);
于 2013-01-03T01:15:29.253 に答える
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 を参照してください

結果:

| 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 |
于 2013-01-03T01:48:57.577 に答える
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
于 2013-01-03T01:15:43.300 に答える