0

私はトランスポート プランナーに取り組んでおり、選択した日付までにタスクを表示するために、次の mysql クエリを使用しています。

    SELECT *
    FROM planner
    WHERE '$date' >= date
    AND '$date' <= valid_till
    AND (frequency = 'daily'
    OR (frequency = 'once' AND date('$date') = date)
    OR (frequency = 'weekly' AND 0 = (abs(datediff('$date', date)) % 7))
    OR (frequency = 'two-weekly' AND 0 = (abs(datediff('$date', date)) % 14))
    OR (frequency = 'monthly'
    AND ceil(dayofmonth('$date')/7) = ceil(dayofmonth(date)/7)
    AND dayofweek('$date') = dayofweek(date)))
    AND dayofweek('$date') <> '1'
    AND dayofweek('$date') <> '7'

例として、月曜日、水曜日、木曜日にのみ表示する必要があるタスクがいくつかあります。プランナーテーブルに新しい列を作成すると思いました: only_on_days (varchar) のように入力します: '2, 4, 5' 2 は月曜日、4 は水曜日、5 は木曜日を表します。

この機能を追加するためにクエリを変更するのを手伝ってくれる人はいますか? それとも、もっと良いアイデアがあるのでしょうか?

編集

次のような新しいテーブルを作成しました: planner_days (例):

id --- planner_id --- day
1          12          2
2          12          3
3          12          4
4          12          5
5          12          6
6          13          3
7          13          5

@eugen-rieckと言ったように、結合クエリを作成しようとしました。

SELECT planner.*, planner_days.*
FROM planner
LEFT JOIN planner_days
ON planner.planner_id = planner_days.planner_id
WHERE '$date' >= date
AND '$date' <= valid_till
AND (frequency = 'daily' AND dayofweek('$date') = planner_days.day
OR (frequency = 'once' AND date('$date') = date)
OR (frequency = 'weekly' AND 0 = (abs(datediff('$date', date)) % 7))
OR (frequency = 'two-weekly' AND 0 = (abs(datediff('$date', date)) % 14))
OR (frequency = 'monthly'
AND ceil(dayofmonth('$date')/7) = ceil(dayofmonth(date)/7)
AND dayofweek('$date') = dayofweek(date)))
AND dayofweek('$date') <> '1'
AND dayofweek('$date') <> '7'

これは機能しますが、毎日表示する必要があるタスクが複数回表示されるようになりました.誰かがこれに対する解決策を持っていますか?

4

1 に答える 1

4

別々にアクセスしたい場合は、1 つのフィールドに複数の情報を格納しないでください。CSV リストをフィールドに配置することは、破滅へのレシピです。

標準的な方法は、taskidそれらを表示する日とジョイント可能なものを用意してAND dayofweek('$date') <> '1' AND dayofweek('$date') <> '7'から、結合に解決することです

于 2013-06-12T10:04:57.020 に答える