0

次のようなクエリがあります (明確にするために、関連性のないフィールド/結合を削除しようとしました):

SET @num = -1;
SELECT 
*,
CAST(DATE_ADD( '2012-04-01', interval @num := @num+1 day)AS DATE) AS date_sequence, 
DAYOFWEEK(DATE_ADD('2012-04-01', interval @num+1 day)) AS day_week
FROM batch AS b1

left join (
select
batch.`startedDate` AS batch_startedDate,
epiRun.`runType` AS epiRun_runType
.... other fields selected.........
from batch
left join `epiRun` epiRun ON epiRun.`batchID`= batch.`keyID`
.......other joins........
WHERE batch.`startedDate` >= '2012-04-01' AND batch.`startedDate` <= '2012-04-18' 
ORDER BY  batch.`startedDate`ASC) 
AS b2 ON cast((b2.`batch_startedDate`) AS DATE)=CAST(DATE_ADD('2012-04-01', interval @num+1
day)AS DATE)

WHERE
(DATE_ADD('2012-04-01', interval @num+1 day) <= '2012-04-18') 

ネストされた選択クエリは、単独で実行すると期待どおりに動作します。このクエリにはいくつかの問題があります。

- バッチ テーブルのすべてのフィールドが選択されますが、これは iReport 用であるため、それほど問題ではありません。

- 4 月 1 日から 4 月 18 日までの日付のリストを取得しますが、1 日に複数のバッチがある場合、表示されるのは 1 つだけです。理想的には、日付列に複数の同一のエントリがあり、バッチごとに一意のエントリが必要です。バッチがない日があることを確認できることが重要です。

私が持っているテーブルの例:

Date          Batch
01/04/2012    TS01
02/04/2012    TS03
03/04/2012    null

そして私が生成したいもの:

Date          Batch
01/04/2012    TS01
01/04/2012    TS02
02/04/2012    TS03
02/04/2012    TS04
03/04/2012    null
4

1 に答える 1

0

個人的には、別の「日付」テーブルを作成し、2000 年 1 月 1 日から 2050 年 12 月 31 日までのすべての日付 (または、すべての潜在的なクエリをカバーする日付範囲) を入力してから、そのテーブルから左結合を実行します。バッチおよび epiRun テーブルに。

これは、あなたが探していることを行うためのよりクリーンな方法であり、まさにあなたが望む結果をもたらすと思います.

于 2012-08-15T18:53:19.553 に答える