2011-01-26 29 views
5

我有一张桌子,一个班级,还有一张我称之为“课程”的桌子 - 也就是某个特定的人在特定地点教授的课程实例。我想拉一张表,基本上只是根据某些课程参数向我显示哪些类是活动的。例如:我可以连接两个表,只有一个匹配的每个表中的一行MySQL的?

 
CLASSES 
class_id|class_name 
--------|------------ 
     1|Class One 
     2|Class Two 
     3|Different Class 
etc... 

COURSES 
course_id|class_id|room 
---------|--------|-------- 
     1|  3|  1 
     2|  3|  2 
     3|  1|  1 
     4|  3|  1 
     5|  3|  2 
     6|  2|  1 
etc... 

我不知道是否有一种方式,我可以得到类似SELECT classes.* FROM classes JOIN courses ON classes.class_id=courses.class_id WHERE courses.room=1返回各只有一个类的实例。发生了什么事是,我得到只是发生在室1类,但我发现每一个的多个实例,因为在房间的课程表类的多个实例1

我已经尝试了所有不同种类的JOIN - 左,右,内部等 - 并且因为我从一张桌子上根据另一张桌子的规格拉出,他们似乎都给了我相同的结果。

所以我越来越:

 
class_id| class_name |course_id|room 
--------|--------------|---------|-------- 
     1|Class One  |  3|  1 
     2|Class Two  |  6|  1 
     3|Diferent Class|  1|  1 
     3|Diferent Class|  4|  1 
etc... 

但我只想得到:

 
class_id| class_name |course_id|room 
--------|--------------|---------|-------- 
     1|Class One  |  3|  1 
     2|Class Two  |  6|  1 
     3|Diferent Class|  1|  1 
etc... 

我可以只JOIN关于在类的每一行的第一场比赛?我对MySQL很有新意,所以我在表达我想要做的事情时遇到了一些麻烦;我道歉。

另外:我通过PDO把所有这一切都拉进了PHP - 也许有一种具体的方法可以在PDO中完成这个任务吗?

+1

如果您只需要COURSES表中的一条记录,那么您需要哪些记录? IE:总是最低的courseid(&room?)值? – 2011-01-26 22:08:41

+0

说实话无所谓。你说得对,我应该说。我只是想要CLASSES数据;我要参加课程的唯一原因是只获得那些具有正确标准的相应课程的课程。 – 2011-01-26 22:29:40

回答

8
SELECT 
    classes.class_id, 
    classes.name, 
    courses.room 
FROM classes 
    JOIN courses 
     ON classes.class_id=courses.class_id 
WHERE courses.room=1 
GROUP BY classes.class_id,classes.name,courses.room 

GROUP BY允许您汇总结果在指定的,所以(在这种情况下)等领域将采取只是(classes.class_id,classes.name,courses.room)

有关详细信息,独特的元组 http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

2
SELECT cl.class_id, cl.class_name, c.course_id, c.room 
FROM classes cl 
JOIN courses c 
ON  c.course_id = 
     (
     SELECT ci.course_id 
     FROM courses ci 
     WHERE ci.class_id = cl.class_id 
       AND ci.room = 1 
     ORDER BY 
       ci.class_id, ci.course_id -- or whatever 
     LIMIT 1 
     ) 

通过在子查询改变ORDER BY条款,您可以定义的类将返回(即用最少的或最大的id等)

+1

这似乎工作,但它花了phpMyAdmin 76秒执行。任何想法可能会导致这种情况? – 2011-01-26 22:41:21

相关问题