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

PHP+MySQLの再帰ロジック

    一緒に結合された、再帰タイプごとのクエリを使用します。

    週次および月次の再帰では、いくつかの相互結合されたクエリを使用して、日付に追加する数値の範囲を生成します。これは、最大1000回の繰り返しの予定に対応しますが、さらに多くの予定に簡単に拡張できます(予定が20年以上繰り返される場合)。

    SELECT a.appoinemnt_id, a.user_id, a.recur_type, a.date AS appoint_date
    FROM tbl_appointment a
    WHERE a.recur_type = 0
    HAVING appoint_date BETWEEN '2014-07-01' AND '2014-07-31'
    UNION
    SELECT a.appoinemnt_id, a.user_id, a.recur_type, DATE_ADD(a.date, INTERVAL units.i + tens.i * 10 WEEK) AS appoint_date
    FROM tbl_appointment a
    CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)units
    CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)tens
    WHERE a.recur_type = 1
    HAVING appoint_date BETWEEN '2014-07-01' AND '2014-07-31'
    UNION
    SELECT a.appoinemnt_id, a.user_id, a.recur_type, DATE_ADD(a.date, INTERVAL units.i + tens.i * 10 MONTH) AS appoint_date
    FROM tbl_appointment a
    CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)units
    CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9)tens
    WHERE a.recur_type = 2
    HAVING appoint_date BETWEEN '2014-07-01' AND '2014-07-31'
    

    ここでのSQLフィドル:-

    http://www.sqlfiddle.com/#!2/6346a2/2




    1. SQLAlchemyORMを使用した一括挿入

    2. MyISAMエンジンテーブルリレーション(MySQL)

    3. 行をコピーしますが、新しいIDを使用します

    4. 繰り返されるキーのMysqlgroup_concatと1つのクエリでの複数の列の繰り返しのカウント(クエリ最適化)