2016-05-03 14 views
0

データベースから利用可能な日付に関する情報を返すSQL文があります。SQL - 日付に応じて週末または曜日の価格が表示されます

SELECT * 
FROM venue 
WHERE NAME NOT IN (SELECT NAME 
        FROM venue_booking 
        WHERE date_booked = '2016-01-17') 
     AND capacity > 150 

テーブルには、平日価格と週末価格の2つの列があります。 日付に応じて、最終出力に1つだけ表示する必要があります。 E.G.日付がその週の場合は、その会場の平日の価格を表示します。

+0

あなたは 'CASE ... END'の構造に精通していますか? –

+0

実際のテーブルを見ることはできますか?私はこの1つを想像するのが難しいと思っています:-( – Strawberry

答えて

0

これはどういう意味ですか?

SELECT *, IF(dayofweek(NOW()) = 7, v.weekday_price, v.weekend_price) as final_price FROM venue v 
WHERE name NOT IN(SELECT name FROM venue_booking WHERE date_booked = '2016-01-17') 
AND capacity > 150 

NOTE

変更番号、ご希望の日番号にIF(dayofweek(NOW()) = 77。 MySQLのリファレンスhereから

1

DAYOFWEEK(日付)

は、日付の曜日指標(1 =日曜日、2 =月曜日、...、7 = 土曜日)を返します。これらのインデックス値は、ODBC標準に対応しています。

この機能をIFまたはCASEとともに使用すると、問題を解決できます。

SELECT `all_fields_other_than_price`, 
    CASE WHEN DAYOFWEEK('2016-01-17') IN (1,7) THEN v.weekend_price 
    ELSE v.weekday_price 
    END AS `VENUE_PRICE` 
FROM venue v 
WHERE name NOT IN(
    SELECT name FROM venue_booking WHERE date_booked = '2016-01-17') 
AND capacity > 150; 
0

使用このクエリ:クエリで同じ日に複数回繰り返す

Select CASE when DAYOFWEEK(booked_date)>1 and 
    DAYOFWEEK(booked_date)< 7 then weekday_price 
    ELSE weekend_price 
    END as price 
    From venue 
WHERE NAME NOT IN (SELECT NAME FROM venue_booking WHERE date_booked = '2016-01-17') AND capacity > 150 
0

は(一貫性のあるクエリを維持するという点で)危険なことができます。さらに、私はNOT INのファンではありません。NULLの値で直感的に動作しないためです。

だから、あなたは考えるかもしれない:

SELECT v.*, 
     (CASE WHEN dayofweek(thedate) IN (1, 7) then weekend_price 
      ELSE weekday_price 
     END) as price 
FROM (SELECT date('2016-01-17') as thedate) params CROSS JOIN 
    venue v LEFT JOIN 
    venue_booking vb 
    ON v.name = vb.name AND vb.date_booked = thedate 
WHERE vb.name IS NULL AND 
     v.capacity > 150 
関連する問題