sql >> データベース >  >> RDS >> Mysql

定期的なイベント、SQLクエリ

    私が何かを見逃していない限り、答えは驚くほど簡単です。 UNIONは、それらの列が異なるテーブルからのものであっても、エイリアスを使用して共通の列でソートできることに気づいていませんでした。したがって、完全なクエリは次のようになります。

    SELECT DISTINCT(e.eventid),n.nameid,n.firstname,n.lastname,d.dt AS dait,r.recurring
    FROM dates d 
    LEFT JOIN recurringtypes r
    /* if event recurring every week E.g. 'Every Monday' */
    ON (r.rectypeid BETWEEN 2 AND 8 AND r.day = d.dow) 
    /* if event recurring every month E.g. 'First Monday, every month' */
    OR ((r.rectypeid BETWEEN 9 AND 36) AND r.day = d.dow AND r.occurrence = d.occurrence) 
    /* if event recurring every last week of month E.g. 'Last Monday, every month' */
    OR (r.rectypeid >= 37 AND r.day = d.dow and r.islast = d.islast)
    LEFT JOIN events e on e.rectypeid = r.rectypeid
    LEFT JOIN eventtypes t ON e.eventtypeid = t.eventtypeid
    LEFT JOIN names n ON e.namesid = n.namesid
    WHERE (d.dt BETWEEN '2012/02/01' AND '2012/05/01')
    UNION
    SELECT e.eventid,n.nameid,n.lastname,n.firstname,e.firstdate AS dait,'No' as Recurring
    FROM events e
    LEFT JOIN names n ON n.names = e.namesid 
    AND e.rectypeid <= 1 
    WHERE e.firstdate BETWEEN '2012/02/01' AND '2012/05/01' 
    ORDER BY dait;
    

    日付を検索するためにテーブルを使用することは、日付が最終的になくなるためリスクであることが指摘されていますが、これは本当ですが、日付がたとえば月の最初の月曜日(または2番目または4番目)であるかどうかを計算するまたは、4番目で最後の)、現時点で説明したいよりも複雑なSQLコードのようです。



    1. Linuxターミナルでセーフモードを使用してパスワードを設定した後でも、MySqlrootユーザーにアクセスできません

    2. ActiveRecordを使用してmysqlでDISTINCTONを使用する方法

    3. MariaDBでのFROM_UNIXTIME()のしくみ

    4. mysqlは文字列上の完全な単語または単語の先頭に一致するのが好きです