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

明らかに、特に矛盾する情報がある場合は、履歴をリストに 2 回入れたくありません。

何か案は?

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 に答える