0

本当に明らかな何かが欠けているかどうかはわかりませんが、このクエリで構文エラーが発生し続けます。明らかな何かが欠けている場合でも、求めているものを取得するためのよりスマートな方法があるかどうかを知りたい.

基本的に、このクエリは、月曜日から金曜日までの start_date を持つユーザーに関連付けられたすべての行を要求します。それはうまくいきます。しかし、その土曜日または日曜日に行がある場合に備えて、条件付きクエリを追加しました。条件付きクエリは、メイン クエリのユーザーではなく、土曜日または日曜日の ANY ユーザーをチェックしていることに注意してください。

SELECT user_id,
DATE_FORMAT(DATE(shift_start),'%m/%d/%Y') date, 
TIME_FORMAT(TIME(shift_start), '%h:%i %p') start,
TIME_FORMAT(TIME(shift_end), '%h:%i %p') end,
title   
FROM shifts
WHERE user_id = '$user_id'
AND DATE(shift_start) BETWEEN
DATE_SUB(DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY) AND
DATE_ADD(DATE(NOW()), INTERVAL 
    (SELECT
    IF( 
    COUNT(*) FROM shifts
    WHERE DATE(shift_start) BETWEEN
    DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND
    DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY),
6, 4)) - WEEKDAY(NOW()) DAY)
ORDER BY shift_start

IF の部分を台無しにする前に、それがどのように機能するかを実際にかなり誇りに思っていますが、これを行う明らかにより良い方法があれば、私はすべて耳にします。

ああ、これが解決されると、「Now()」はphpスクリプトで設定された日付変数に置き換えられます(GET経由で渡されます)。


素晴らしい仕事、ベンルーミー。うまくいったのは次のとおりです。

SELECT user_id,
       DATE_FORMAT(DATE(shift_start),'%m/%d/%Y') AS shift_start_date, 
       TIME_FORMAT(TIME(shift_start), '%h:%i %p') AS shift_start_time,
       TIME_FORMAT(TIME(shift_end), '%h:%i %p') AS shift_end_time,
       title
FROM shifts
WHERE user_id = '$user_id' AND 
DATE(shift_start) BETWEEN 
    DATE_SUB(DATE(NOW()), INTERVAL WEEKDAY(NOW()) DAY) 
    AND 
    DATE_ADD
    (
        DATE(NOW()), INTERVAL
        (
        SELECT IF(COUNT(*),6,4)
        FROM shifts
        WHERE DATE(shift_start) BETWEEN 
            DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) 
            AND 
            DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY)
        ) - WEEKDAY(NOW()) DAY
    )
4

2 に答える 2

2

このサブクエリを試してください:

(SELECT 
    IF(COUNT(*) > 0, 6, 4)) - WEEKDAY(NOW()) DAY) 
    FROM shifts 
    WHERE DATE(shift_start) BETWEEN
    DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND
    DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY)

やったことは2つ

  • 私の知る限り、from と where は if の中に入ることはできません。
  • if に条件を入れます。mysql が自動的に 0 を false として、>0 を true として解釈するとは思わないでください。
于 2009-07-15T06:48:01.960 に答える
1

これはここでバラバラになります:

    (SELECT
    IF( 
       COUNT(*) FROM shifts
    WHERE DATE(shift_start) BETWEEN

count ステートメントは機能しません。

あなたは何をしようとしているのですか?ここで達成しようとしていることを明確に説明する必要があります。

これは私の盗品です:

 (SELECT
    IF( 
      (select COUNT(*) FROM shifts
       WHERE DATE(shift_start) BETWEEN
       DATE_ADD(DATE(NOW()), INTERVAL 5 - WEEKDAY(NOW()) DAY) AND
       DATE_ADD(DATE(NOW()), INTERVAL 6 - WEEKDAY(NOW()) DAY))>0,6,4)
 ) - WEEKDAY(NOW()) DAY

しかし、あなたが何をしようとしているのかを知らなければ、私にはわかりません。

于 2009-07-15T06:50:55.153 に答える