2

私はこのようなテーブルを持っています

    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

session_date 列にはコースの開始日と終了日が表示されるため、テーブルには ID とタイトルごとに 2 つのエントリがあります。

過去のコースを表示せずに、次の 5 つのコースを取得するクエリを作成しようとしています。

私はここまでたどり着きました

    SELECT session_date, title, courseid
    FROM table
    WHERE published = 1 AND session_date > DATE(NOW())
    ORDER BY session_date ASC LIMIT 0,5

これにより、次の 5 つのセッション日付のテーブルから行が取得されますが、開始日と終了日の両方が含まれていますが、次の 5 つのコースを開始日順に並べる必要があります。

各 courseid の最も早い session_date を取得するクエリを作成する必要がありますが、同じ courseid の最新の session_date を含む行は無視しますが、これを行う方法が完全に失われています。

ヘルプやアドバイスをいただければ幸いです。

4

3 に答える 3

2

結果をコースごとにグループ化し、 を選択するMAX(session_date)と、各コースに関連付けられた最新の日付 (つまり、終了日) が取得されます。

SELECT   courseid, MIN(session_date) AS start_date
FROM     `table`
WHERE    published = 1
GROUP BY courseid
HAVING   start_date > CURRENT_DATE
ORDER BY start_date ASC
LIMIT    5

sqlfiddleで参照してください。

于 2012-07-04T22:38:04.107 に答える
1

あなたがする必要があるのは、グループsession_dateごとに最小の行のみを取得courseidし、その結果セットで並べ替えることです:

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

しかし、はるかに優れた設計は、1 つの行に 1 つのみを使用し、courseid開始日と終了日を指定する 2 つの列を使用することです。

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
于 2012-07-04T22:47:09.637 に答える
0

SELECT 句のすべての列の値が繰り返されるため、 DISTINCT を使用するだけです

SELECT distinct session_date, title, courseid FROM table WHERE published = 1 AND session_date > DATE(NOW()) ORDER BY session_date ASC LIMIT 0,5

于 2012-07-04T22:50:57.543 に答える