2012-12-05 52 views
2

我正在更新我們學校的網站,並且我們有一系列可用的課程列表。MySQL創建相關課程列表

的課程列表在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 

很明顯,我不希望兩次列表中的歷史記錄,特別是在信息衝突的情況下。

任何想法?

回答

1

這裏是一個SQLFiddle demo。如果結果數據集r.related_course_id不爲空,那麼你應該勾選複選框

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 
+0

謝謝!目前它似乎工作得很好,我會嘗試在一個更大的數據集上進行測試,但看起來正是我想要的。 –

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 
+0

不幸的是我嘗試了group by子句,並預期它沒有工作,但它刪除列表中的重複的課程,課程實例中刪除也是一個鏈接它與當前正在編輯的課程 –

+0

已編輯我的查詢,現在檢查與明確 –