我有一个表,类和另一个我称之为“课程”的表 - 也就是说,某个特定人在特定地方教授的课程。我想拉一个表,基本上只是根据某些课程参数向我显示哪些类是活动的。例如:
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...
我可以在Classes中每行的第一场比赛中只有JOIN
吗?我对MySQL很新,所以我在表达我想要做的事情时遇到了一些麻烦;我道歉。
另外:我通过PDO
将所有这些内容转移到PHP中 - 也许有一种特定方法可以在PDO
中完成此操作?
答案 0 :(得分: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
答案 1 :(得分: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
等的类)