MySQL,根据值选择列名

时间:2014-07-29 01:36:09

标签: mysql

我有一个数据库,其中包含需要作为列名完成的培训课程编号。每次添加新培训表单时,都会为其创建一个新列。 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中执行此操作会更简单吗?

3 个答案:

答案 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您的数据,您可以制作数据库架构,以便为您强制执行某些规则:

  • 课程ID必须是唯一的。
  • 学生ID必须是唯一的。
  • 注册课程的学生必须具有真实的学生ID,课程必须具有真实的课程ID。
  • 学生不能同时注册多个课程。
  • 学生只能拥有一个课程状态。

示例模式:

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