【问题标题】:Can I JOIN two tables with only one match for each row of one table in MySQL?我可以在 MySQL 中为一个表的每一行加入两个表,并且只有一个匹配项吗?
【发布时间】:2011-01-26 22:03:58
【问题描述】:

我有一个表,Classes 和另一个表,我称之为“课程”——即由特定人员在特定地点教授的课程实例。我想拉一张表格,基本上只是根据某些课程参数向我显示哪些课程处于活动状态。例如:

课程 类id|类名 --------|------------ 1|一级 2|二级 3|不同的类 ETC... 培训班 course_id|class_id|房间 ---------|--------|-------- 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|房间 --------|-------------|---------|-------- 1|一级| 3| 1 2|二级| 6| 1 3|不同等级| 1| 1 3|不同等级| 4| 1 ETC...

但我只想得到:

class_id| class_name |course_id|房间 --------|-------------|---------|-------- 1|一级| 3| 1 2|二级| 6| 1 3|不同等级| 1| 1 ETC...

我可以在 Classes 中的每一行的第一场比赛中只使用 JOIN 吗?我对 MySQL 有点陌生,所以我很难清楚地表达我想做的事情;我很抱歉。

另外:我正在通过PDO 将所有这些都放入 PHP 中 - 也许在 PDO 中有一种特定的方法可以实现这一点?

【问题讨论】:

  • 如果您只想要 COURSES 表中的一条记录,您想要哪一条? IE:总是最低的 courseid (& room?) 值?
  • 老实说没关系。你说得对,我应该这么说。我只是想获取 CLASSES 数据;我选择 COURSE 的唯一原因是只获得那些具有正确标准的相应课程的课程。

标签: php mysql


【解决方案1】:
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

【讨论】:

  • 不选择课程列并不意味着输出不会重复。
  • @OMG Ponies 但“分组依据”会
  • 我添加了一个 GROUP BY 约束,对问题的查询没有选择任何关于课程的数据
  • 这似乎完全符合我的要求。有什么理由不使用GROUP BY
  • 然后评论 Ben Saufley 对他自己的问题的评论说明了这一点
【解决方案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 等的类)

【讨论】:

  • 这似乎可行,但执行 phpMyAdmin 需要 76 秒。知道是什么原因造成的吗?
猜你喜欢
  • 2014-08-09
  • 2019-06-08
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2013-05-08
相关资源
最近更新 更多