2

私はphp [学生の出席システムの処理]で自分のプロジェクトに取り組んでいます。学生のリストとその一意の ID [ jntuno] があり、各科目の各学生の毎日の出席を格納するために、mysql にデータベースを作成する必要があります。だから私はこの方法でテーブルを作成しました:

students次のフィールドとデータを含むテーブルが mysql にあります。

私のテーブルの内容

jntunoここで、フィールドの各値を新しいテーブルの列として使用して新しいテーブルを作成したいと考えています。

新しいテーブル [名前を付けましょうattendance] に、次のような列が必要です。

+------------+-----------+----------+-----------+-----------+
|11341A0501  |11341A0502 |11341A0503|11341A0504 |11341A0505 |......      
+------------+-----------+----------+-----------+-----------+
|            |           |          |           |           |

mysql でこれを行う方法は?

後でattendanceテーブルに 3 つのフィールドを追加します。

-> date[特定の科目が教えられる日付] ,

-> subject[教科名] と

-> hours taught[特定の科目が教えられる時間数 (1 または 2 または 3 ... 6 まで)]

subject特定のことを教えられるたびに、テーブルdateに新しいものが追加されますrowattendance

例:

+------------+-----------+-----------------+------------+-----------+----------+-----------+-----------+
|date        |subject    | classes taught  |11341A0501  |11341A0502 |11341A0503|11341A0504 |11341A0505 |..    
+------------+-----------+-----------------+------------+-----------+----------+-----------+-----------+
|2013-09-31  |OOPS       |3                |2           |3          |0         |1          |3          |

テーブルへの出席の入力がより高速になるように、この方法でテーブルを選択します。

しかし、多くの人はこれをBAD DATABASE STRUCTUREと呼んでいます。私の問題に対して、他に優れた効率的なデータベース設計があれば教えてください。

4

8 に答える 8

3

次のステートメントを使用して新しいテーブルを作成します。

select @s:=concat('create table students_col (',group_concat(jntunno,' CHAR(10)' order by slno),')') from students;
prepare stmt from @s;
execute stmt;
deallocate prepare stmt;

CREATE TABLEを使用して がどのように構築されるかを観察します。group_concat

デモ: SQL フィドル

名前も挿入したい場合は、次のステートメントを使用します。

select @s:=concat('insert into students_col values (',group_concat(concat('"',name,'"') order by slno),')') from students;
prepare stmt from @s;
execute stmt;
deallocate prepare stmt;
select * from students_col;

これが私の全トレイルです:

mysql> drop table if exists students;
Query OK, 0 rows affected (0.00 sec)

mysql> create table students (slno integer, jntunno char(10), name varchar(50));
Query OK, 0 rows affected (0.07 sec)

mysql> insert into students values (1,'1134A0501','ADARI GOPI');
Query OK, 1 row affected (0.00 sec)

mysql> insert into students values (2,'1134A0502','BALU');
Query OK, 1 row affected (0.00 sec)

mysql> insert into students values (3,'1134A0503','GEETHA');
Query OK, 1 row affected (0.00 sec)

mysql> drop table if exists students_col;
Query OK, 0 rows affected (0.00 sec)

mysql> select @s:=concat('create table students_col (',group_concat(jntunno,' CHAR(10)' order by slno),')') from students;
+-----------------------------------------------------------------------------------------------+
| @s:=concat('create table students_col (',group_concat(jntunno,' CHAR(10)' order by slno),')') |
+-----------------------------------------------------------------------------------------------+
| create table students_col (1134A0501 CHAR(10),1134A0502 CHAR(10),1134A0503 CHAR(10))          |
+-----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> prepare stmt from @s;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute stmt;
Query OK, 0 rows affected (0.21 sec)

mysql> deallocate prepare stmt;
Query OK, 0 rows affected (0.01 sec)

mysql> 
mysql> select @s:=concat('insert into students_col values (',group_concat(concat('"',name,'"') order by slno),')') from students;
+------------------------------------------------------------------------------------------------------+
| @s:=concat('insert into students_col values (',group_concat(concat('"',name,'"') order by slno),')') |
+------------------------------------------------------------------------------------------------------+
| insert into students_col values ("ADARI GOPI","BALU","GEETHA")                                       |
+------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> prepare stmt from @s;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

mysql> execute stmt;
Query OK, 1 row affected (0.00 sec)

mysql> deallocate prepare stmt;
Query OK, 0 rows affected (0.00 sec)

mysql> 
mysql> select * from students_col;
+------------+-----------+-----------+
| 1134A0501  | 1134A0502 | 1134A0503 |
+------------+-----------+-----------+
| ADARI GOPI | BALU      | GEETHA    |
+------------+-----------+-----------+
1 row in set (0.00 sec)

mysql> 
于 2013-10-19T07:14:56.320 に答える
0
create table new_table
select distinct jntuno from students;

また

create table new_table (jntuno varchar(10));
insert into new_table 
select distinct jntuno from students;
于 2013-10-06T08:39:15.943 に答える
0

試す

create table new_table (jntuno varchar(10),fieldsname varchar(10));
insert into new_table(jntuno,fieldsname)
values(select distinct jntuno from s tudents,'test');
于 2013-10-06T08:45:06.883 に答える
0

学生を追加するたびに列を追加する必要はありません。

私はそれを次のように設計します:

Table:  Attendance
    Columns:
        Date
        Subject
        ClassNumber
        Missed_jntuno

次に、欠席した学生/クラスの組み合わせごとに行を追加します (または、学生が出席するよりも多く欠席する場合は、Attended_jntuno代わりにそれをフィールドに反転し、クラスに参加したときに行を追加することをお勧めします。常にすべての生徒の行を書き、次に出席したかどうかを示す別のビット/ブール値の列を作成します)。

この方法の利点の 1 つは、毎日の合計に加えて、どのクラスがどの生徒を獲得したかを確認できることです。もう 1 つの理由は、柔軟なレポートを作成する OLAP キューブなどとの親和性が高いことです。

于 2013-10-24T10:27:53.770 に答える
0

この DB をより適切に設計する方法について、あなたの質問に答えてみます。

説明: 生徒ごとに列を持ち、毎日行を想定する代わりに、生徒 x ごとに日ごとに行を持つようにテーブルを設定する必要があり、外部キーを使用してデータの整合性を確保できます。

これの主な理由は、通常、学生の数が静的な数ではないなどです。このような設定でデータの使用を最適化するには、基本的に、学生が追加または削除されるたびにテーブルを再作成する必要があります。したがって、30 人の学生から始めると、30 列のテーブルができます。レコードを追加するたびに学生の数が 15 人に減ると、15 の未使用の値が作成され、これは徐々にストレージよりも多くのストレージを占有します。実際に必要です。

解決策: 出席表を次のように構成する場合:

attendance ID | JNTUNO | Date | Subject | Hours

出席IDは単に行の一意の識別子になります。GUIDまたは自動インクリメントされたintのいずれかをお勧めします

JNTUNO は、Student テーブルを指す外部キーになります。

このように、前に提示したシナリオでは、30 人の学生の場合、それぞれ 5 つの値を持つ 30 行を毎日追加しますが、学生の数が 15 人に変わると、15 行しか追加しません。

MYSQL 構文はよくわかりませんが、説明が明確でない場合は、必要に応じて具体的な実装をまとめてみることができます。私に知らせて。

于 2013-10-21T23:15:11.113 に答える