1

これはMysql/sqlクエリの質問ですが、コンテキストを説明できます。PHPカレンダーに「<PREV」および「NEXT>」ボタンを装備して、ユーザーが前または次の利用可能な月に簡単に移動できるようにします。利用可能なデータベースエントリがあります。使用可能なデータベースエントリがない場合は、ボタンを無効にします(システムに空のカレンダーを表示させたくありません)。

例: ユーザーはFEBを表示しています。JANとMARにはエントリが含まれていませんが、DECとAPRには含まれています。次に、[次へ>]ボタンを4月のカレンダーに切り替える必要があります。「<PREV」ボタンは12月のカレンダーに切り替える必要があります。

したがって、基本的には、表示されている月の前後(一部ではない)にエントリが存在するかどうかを確認できる単一の効率的なクエリを探しています。

テーブルには、日付'Ymd'タイプのフィールド'logDate'があります。

最初に、指定された日付の前後に日付が存在するかどうかを確認するために、次のクエリをいじり始めましたが、このクエリにはいくつかの問題があることを理解しています。1つは、「2013-03-19」のテーブルにエントリがある場合、クエリはprevに1を吐き出します。これは、もちろん、3月より前の月にエントリが存在するかどうかを示しません。

SELECT IF( EXISTS(SELECT dayId FROM LogbookDay 
WHERE logDate < '2013-03-20' AND userId = 2), 1, 0) as prev, 
IF( EXISTS(SELECT dayId FROM LogBookDay WHERE logDate > '2013-03-20' 
AND userId = 2), 1, 0) as next
4

3 に答える 3

4

開始日を月の初めと終わりに変更します。前の場合は、月の現在の日より1少ない値を引いて、月の最初の日に変更します。次に、同じことを行い、1か月を追加します。

SELECT 
(SELECT dayId FROM LogbookDay WHERE 
    logDate < ADDDDATE('2013-03-20', 1-DAY('2013-03-20')) AND userId = 2
    ORDER BY logDate DESC LIMIT 1
) as PREV,
(SELECT dayId FROM LogBookDay WHERE 
    logDate >= ADDDATE(ADDDDATE('2013-03-20', 1-DAY('2013-03-20')), INTERVAL 1 MONTH) AND userId = 2
    ORDER BY logDate ASC LIMIT 1
) as NEXT

(または、PHPでこれを行うと、コードが読みやすくなる可能性があります。)

結果がnullであるか日付であるかに応じて、リンクの表示方法が異なります。

IDの代わりに日付を取得する場合は、よりエレガントになる可能性があります。

    SELECT 
(SELECT MAX(logDate) FROM LogbookDay WHERE 
    logDate < ADDDDATE('2013-03-20', 1-DAY('2013-03-20')) AND userId = 2
) as PREV,
(SELECT MIN(logDate) FROM LogBookDay WHERE 
    logDate >= ADDDATE(ADDDDATE('2013-03-20', 1-DAY('2013-03-20')), INTERVAL 1 MONTH) AND userId = 2
) as NEXT

しかし、それはあなたが見つけた情報で何をしているかに正確に依存します。新しい月へのリンクを作成するだけの場合は、同じ月にない最も近い日付を取得することでうまくいくはずです。

于 2013-03-21T17:23:48.770 に答える
1

私自身のクエリと投稿された回答の1つからのポインタを使用して、現在表示されている月の前後の月にエントリが存在するかどうかを確認する簡単なクエリを思い付くことができました。

表示されている月が2013年3月であると想定します。

SELECT IF( EXISTS(SELECT dayId FROM LogBookDay 
WHERE logDate < '2012-03-01' AND userId = 1), 1, 0) as prev,
IF( EXISTS(SELECT dayId FROM LogBookDay 
WHERE logDate > CONCAT('2012-03-',LAST_DAY('2003-02-05')) 
AND userId = 1), 1, 0) as next
于 2013-03-21T18:09:57.510 に答える
0
SELECT 
if(min(logDate) < '2013-03-20', 1, 0) 'NEXT',
if(max(logDate) > '2013-03-20', 1, 0) 'PAST'
FROM LogbookDay 
WHERE logDate < '2013-03-20' AND logDate > '2013-03-02' 
AND  userId = 2
于 2013-03-21T17:32:08.930 に答える