Mysql 具有唯一值的列的SQL查询

Mysql 具有唯一值的列的SQL查询,mysql,unique,Mysql,Unique,我有一张像这样的桌子 courseid session_date title published 1 2012-07-01 Training Course A 0 1 2012-07-02 Training Course A 0 2 2012-07-04 Training Course B 1

我有一张像这样的桌子

    courseid     session_date     title                 published
    1            2012-07-01       Training Course A     0
    1            2012-07-02       Training Course A     0
    2            2012-07-04       Training Course B     1
    2            2012-07-07       Training Course B     1
    3            2012-07-05       Training Course C     1
    3            2012-07-06       Training Course C     1
    4            2012-07-07       Training Course D     1
    4            2012-07-10       Training Course D     1
表中每个ID和标题有两个条目,因为session_date列显示课程的开始日期和结束日期

我正在尝试创建一个查询,该查询将在不显示任何过去课程的情况下提取接下来的五门课程

我已经走了这么远

    SELECT session_date, title, courseid
    FROM table
    WHERE published = 1 AND session_date > DATE(NOW())
    ORDER BY session_date ASC LIMIT 0,5
这将从表中提取下五个课程日期的行,但它同时包括开始日期和结束日期,而我需要按开始日期排序下五个课程

我需要创建一个查询,该查询将为每个courseid提取最早的session_日期,但忽略同一courseid具有最新session_日期的行,但我完全不知道如何执行此操作


非常感谢您提供的任何帮助或建议。

如果您按课程对结果进行分组,并选择
MAX(课程日期)
,您将获得与每门课程相关的最新日期(即完成日期):


请参见。

您需要做的是仅检索每个
courseid
组中具有最小
session\u日期的行,并按结果集排序:

SELECT
    b.*
FROM
    (
        SELECT courseid, MIN(session_date) AS mindate
        FROM tbl
        GROUP BY courseid
    ) a
INNER JOIN
    tbl b ON a.courseid = b.courseid AND a.mindate = b.session_date
WHERE
    b.session_date > NOW() AND
    b.published = 1
ORDER BY
    b.session_date
LIMIT 5
但更好的设计是每个
courseid
只有一行,并有两列指定开始和结束日期:

tbl
------------------
courseid [PK]
start_date
end_date
title
published
然后你可以简单地做:

SELECT *
FROM tbl
WHERE start_date > NOW() AND published = 1
ORDER BY start_date
LIMIT 5

由于SELECT子句中所有列的值都是重复的,所以只需使用DISTINCT


选择不同的会话\日期、标题、课程ID
从桌子上
其中published=1,session_date>date(NOW())
按会话的订单\u日期ASC限制0,5

对于每个培训课程,有两个课程日期(开始日期+结束日期)。这两行都是不同的行,因此在查询中使用distinct实际上不会减少返回的行数。。。OP声明“我需要创建一个查询,该查询将为每个courseid提取最早的会话日期,但忽略包含最新会话日期的行”Hi Zane,感谢您的回复,我非常感谢您抽出时间来帮助我。您的解决方案有效,但我使用了上面来自eggyal的解决方案,因为它在代码上稍微轻一点。
SELECT *
FROM tbl
WHERE start_date > NOW() AND published = 1
ORDER BY start_date
LIMIT 5