2009-07-15 26 views
0

本当に明白なものがないかどうかわかりませんが、このクエリで構文エラーが発生しています。私が何か明白なものを見逃していても、私が何をしているかを知るためのよりスマートな方法があるかどうかを知りたいです。where節内のMySQL条件付きクエリ

基本的に、クエリは月曜日から金曜日までのstart_dateを持つユーザーに結び付けられた行を要求します。それは素晴らしい作品です。しかし、土曜日または日曜日の行がある場合に条件付きクエリを追加しました。条件付きクエリが土曜日または日曜日、メインクエリではないユーザーを持つユーザーのためにチェックされることに注意してください:私は実際にそれがIF部を台無しにする前に、それがどのように動作するかのかなり誇りに思っています

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 

、しかし、これを行う明らかに良い方法があれば、私はすべての耳です。

ああ、これはアイロンが切れたとき、 "Now()"はPHPスクリプト(GETを介して渡された)に設定された日付変数に置き換えられます。


素晴らしい仕事、benlumey。ここで働いていたものです:

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 
    ) 
+0

クエリを数回読んだ後で、MySQLがあなたのために行うことができる不必要な日付の計算を少し行っているように思われることがありますが、それはおそらく私の理解の欠如です。 「DATE(shift_start)BOOTHWAY DATE_SUB(DATE(NOW())、INTERVAL WEEKDAY(NOW())DAY)AND ...」から「WEEKDAY(shift_start)BETWEEN 1 AND AND ...」まで簡略化できますか? – ruquay

+0

私はWEEKDAY(shift_start)を0と4の間で使っているだけで、月曜日と金曜日の間にあるすべてのシフトを返すことはありません(ほとんどすべてです)。たぶん私はあなたのアドバイスで何かを見逃しています。私はフィードバックを感謝します。それはかなり毛深く、MySQLが私の長いバージョンなしでできることのようです。 – Anthony

答えて

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つのことは、それが通常のクエリのように見せていたから、どこに行くことができませんもし私が知っている限り、if内部に。

  • ifに条件を入れると、mysqlは自動的に0をfalse、> 0をtrueとみなしません。
+0

fromとwhereがif()の中に入ることができない場合、それは本当にdissapointingですが、すべてを説明するでしょう!あなたの第2のポイントまでは、0が偽であるということは、[if文] [1]とまったく同じです。そのため、私はそれを使いたいと思っています。 [1]:[http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if] – Anthony

+0

また、私はあなたのサブクエリがどのように所望の結果。カウントカウントとは何ですか、iffingの場合は何ですか?奇妙に聞こえて申し訳ありません。基本的には、if関数はサブクエリから分離されているように見えますが、クエリ自体からどのようにトリガされているのか分かりません。ここでも、私はここに学びます。 – Anthony

+0

そしてあなたは大きな賞に勝つ!あなたの答えに基づいて本当に簡単な修正をコメントとして投稿します。 – Anthony

1

これは辺りでばらばらになる:

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

カウント文は動作しません。

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

これで私の盗品である:

(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 

しかし、あなたは、私はよく分からないやろうとしているものを知らずに。

+0

「SELECT IF(COUNT(*)FROMシフト」は私の右には見えません。 –

+0

Selectを選択すると、私の心を横切ってしまいましたが、本当にファンキーに見えましたが、深刻なボトルネックを引き起こすようです。私はここに来て、学ぶために考えています(これはまだ分かりませんが、私に教えてください):質問はすべてのユーザの毎週のシフトを引っ張っています。週には週末は無料ですが、誰もが週末のシフトがない場合、出力はMFスケジュールになりますが、ANYのシフトがスケジュールされている場合、出力はM-Sunスケジュールです – Anthony

+0

したがって、クエリ基本的には「今週の土曜日や日曜日のシフト数が0の場合は4を使用して週末の金曜日を終了しますが、それ以外の場合は6とします(カウントダウン*)は、IF()関数をトリガする0またはNullを生成することです。 Date_ADDには6ではなく4を使用します。 – Anthony