2

我正在为我们学校更新一个网站,我们有一个可用的课程列表。

课程列表在 tbl_course_details 中:

CREATE TABLE `tbl_course_details` (
    `uid` int(11) NOT NULL auto_increment,
    `course_name` varchar(100) NOT NULL,
    `course_type` varchar(100) NOT NULL,
    `course_details` longtext NOT NULL,
    `course_added_by` int(4) NOT NULL,
    `course_last_updated` int(30) NOT NULL,
    `course_menu_id` int(4) NOT NULL,
    PRIMARY KEY  (`uid`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=15;

我还有一个名为 tbl_course_related 的表:

CREATE TABLE IF NOT EXISTS `tbl_course_related` (
    `uid` int(11) NOT NULL auto_increment,
    `course_id` int(4) NOT NULL,
    `related_course_id` int(4) NOT NULL,
    PRIMARY KEY  (`uid`),
    KEY `course_id` (`course_id`),
    KEY `related_course_id` (`related_course_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=25;

当工作人员编辑课程时,他们还会获得所有课程的列表(他们当前正在编辑的课程除外)。它旁边还有复选框,因此如果课程与他们正在编辑的课程相关,他们会勾选该框。

我的课程详情表目前有 3 门课程:

Unique ID    Course Name
---------------------------
1            Geography
2            History
3            Art

例如,我将地理与历史相关,而历史与艺术相关,所以我的关系表如下所示:

Unique ID    Course ID     Related Course Id
--------------------------------------------
1            1             2
2            2             1
3            2             3
4            3             2

我希望到目前为止这是有道理的。现在,如果工作人员去编辑地理课程(课程 ID:1),那么我想要一个包含历史和艺术的课程列表,并且只勾选历史复选框。

我当前的 SQL 查询看起来像这样(尽管我已经对其进行了一些更改并且到目前为止没有任何效果):

SELECT d.uid, 
       d.course_name,
       r.related_course_id
FROM tbl_course_details d
LEFT JOIN tbl_course_related r
    ON r.course_id = d.uid 
AND d.uid!=:courseId

但是,这使列表看起来像这样(如果我编辑地理)

Related?   Course Name
No         History
Yes        History
No         Art

显然,我不希望列表中出现两次历史记录,尤其是在信息相互矛盾的情况下。

有任何想法吗?

4

2 回答 2

1

试试这个 ::

SELECT d.uid, 
       d.course_name,
       r.related_course_id
FROM tbl_course_details d
LEFT JOIN tbl_course_related r
    ON r.course_id = d.uid 
AND d.uid!=:courseId

GROUP BY r.course_id

或者您可以使用 DISTINCT::

SELECT 
       DISTINCT(d.course_name),
d.uid,            
r.related_course_id
    FROM tbl_course_details d
    LEFT JOIN tbl_course_related r
        ON r.course_id = d.uid 
    AND d.uid!=:courseId


GROUP BY r.course_id
于 2012-12-05T12:32:46.447 回答
1

这是一个SQLFiddle 演示。如果结果数据集r.related_course_id不为 NULL,则应勾选复选框

SELECT d.uid, 
       d.course_name,
       r.related_course_id
FROM tbl_course_details d
LEFT JOIN tbl_course_related r
    ON (r.course_id = d.uid) and (r.Related_Course_Id=:courseId)

where d.uid!=:courseId
于 2012-12-05T12:44:04.127 回答