我有一个数据库,其中包含需要作为列名完成的培训课程编号。每次添加新培训表单时,都会为其创建一个新列。 0表示未完成,1表示已完成。
我希望能够根据列的值是否为1(完整)来获取特定人员的课程编号(列名)。因此,它必须遍历所有列以检查它们是否为1.但是我不会事先知道列的名称,因为脚本会动态地向表中添加新的课程编号。有什么想法吗?
CREATE TABLE Training(
id int NOT NULL AUTOINCREMENT,
username varchar(6) not null,
`9875` INT(2) NULL,
`875` INT(2) NULL,
`475` INT(2) NULL,
`9835` INT(2) NULL,
`375` INT(2) NULL,
`9872` INT(2) NULL,
`9234` NULL,
`3444` NULL
);
INSERT INTO Training VALUES(kd4893,0,0,1,1,0,1,1,0)
因此,对kd4893的查询将返回475,9835,9872,9234。
在PHP中执行此操作会更简单吗?
答案 0 :(得分:2)
数据库普通表格需要三个表格:
user_id, name
course_id, course_name
user_id, course_id
在短期内这可能会更难,但如果添加许多功能则值得。
如果你想坚持使用一张桌子,为什么不:
一个表:user_name
,逗号分隔的课程名称字符串。
您的插入内容变为:
INSERT INTO Training VALUES(kd4893, "475,9835,9872,9234")
答案 1 :(得分:2)
考虑您的表格,您可以将列名称添加到新数组并加入
$res = mysqli_query($link,"select * from Training where username = 'kd4893'");
$row = mysqli_fetch_assoc($res);
//printing the results
print_r($row);
$newrow = array();
$i = 0;
foreach($row as $key => $value){
if($i > 1){
if($value > 0){
$newrow[] = $key;
}
}
$i++;
}
//printing the joined array
echo join(",",$newrow);
输出结果为:
Array
(
[id] => 1
[username] => kd4893
[9875] => 0
[875] => 0
[475] => 1
[9835] => 1
[375] => 0
[9872] => 1
[9234] => 1
[3444] => 0
)
475,9835,9872,9234
这不是最好的方法,但这是我的答案。
答案 2 :(得分:1)
通过尝试动态生成数据作为列而不是表中记录的一部分,您错过了关系数据库的大量功能。通过normalizing您的数据,您可以制作数据库架构,以便为您强制执行某些规则:
示例模式:
CREATE TABLE IF NOT EXISTS `Courses` (
`ID` INT NOT NULL AUTO_INCREMENT,
`Name` varchar(50) NULL,
PRIMARY KEY (`ID`)
);
CREATE TABLE IF NOT EXISTS `Students` (
`ID` INT NOT NULL AUTO_INCREMENT,
`Name` varchar(50) NULL,
PRIMARY KEY (`ID`)
);
CREATE TABLE IF NOT EXISTS `Enrolled` (
`CourseID` INT NOT NULL,
`StudentID` INT NOT NULL,
`Status` BIT NOT NULL DEFAULT 0,
PRIMARY KEY (`CourseID`, `StudentID`),
FOREIGN KEY (`CourseID`) REFERENCES Courses (`ID`),
FOREIGN KEY (`StudentID`) REFERENCES Students (`ID`)
);
现在我们可以插入一些数据......
INSERT INTO Courses (ID, Name) VALUES (1, "Algebra 1");
INSERT INTO Courses (ID, Name) VALUES (2, "English");
INSERT INTO Students (ID, Name) VALUES (1, "Tom");
INSERT INTO Students (ID, Name) VALUES (2, "Tina");
INSERT INTO Enrolled (CourseID, StudentID, Status) VALUES (1, 1, 0);
INSERT INTO Enrolled (CourseID, StudentID, Status) VALUES (2, 1, 1);
INSERT INTO Enrolled (CourseID, StudentID, Status) VALUES (1, 2, 0);
...并查询一些明智的结果。
以下是我们为Tom完成的所有课程选择CourseID和CourseName的示例:
Select c.ID as CourseID, c.Name as CourseName
From Enrolled as e
Join Courses as c ON e.CourseID = c.ID
Join Students as s on e.StudentID = s.ID
Where s.ID = 1 AND e.Status = 1;
COURSEID COURSENAME
2 English
这是一个用另一个查询注释掉的sql小提琴。随意使用它:http://sqlfiddle.com/#!2/126e5/3/1