2012-02-15 9 views
1

start_date & end_date内にあるclub_idに属するすべての行に対してオファーを返すクエリを作成しようとしていますが、クエリはclub_idと一致するすべての結果も返す必要があります。 end_dateは0です - これを行う方法のアイデアですか? 私の現在のクエリは以下の通りです...MySQLのクエリとタイムスタンプのアシスタンス

SELECT 
    * , 
    UNIX_TIMESTAMP(start_date) AS start_dateStamp, 
    UNIX_TIMESTAMP(end_date) AS end_dateStamp 
FROM 
    (`offers`) 
WHERE 
    UNIX_TIMESTAMP( `start_date`) <1329308797 
AND 
    UNIX_TIMESTAMP( `end_date`) >1329308797 
AND 
    `club_id` =23 
+0

このエラーは何ですか? – maxjackie

+1

end_dateとは何ですか?それは '0000-00-00 00:00:00'ですか? – Devart

+0

申し訳ありませんあなたは正しいDevart - 私は0000-00-00を意味しました – Zabs

答えて

2
SELECT 
    `offers`.* , 
    UNIX_TIMESTAMP(start_date) AS start_dateStamp, 
    UNIX_TIMESTAMP(end_date) AS end_dateStamp 
FROM `offers` 
    WHERE `club_id` =23 
    AND (
    (
     `start_date`<FROM_UNIXTIME(1329308797) 
     AND `end_date`>FROM_UNIXTIME(1329308797) 
    ) 
    OR `end_date`=FROM_UNIXTIME(0) 
) 

私は現場から定数にUNIXタイムスタンプからMySQLの日付にconvertionを移動することに、注意してください - それだけで変換する必要があり、このようにすべての行ではなく、1回です。さらに、この方法でインデックスを使用することができます。

編集

"日付のゼロは" 最後の行のUnix-ゼロが、MySQL-Zeorされていないとstart_dateend_dateのデータ型がDATETIMEでない場合は、さらに

OR `end_date`='0000-00-00' 

する必要がありますしかしDATEあなたが必要です

DATE(FROM_UNIXTIME(...)) 

の代わりに、

FROM_UNIXTIME(...) 
1

end_date = 0start_date > $timestampをreqiresどうかを指定しませんでしたので、私はSTART_DATEはまだその基準を満たさなければならないと仮定。あなたのSQLの

SELECT 
    please_name, 
    the_columns, 
    you_want_to_select_seperately, 
    for_reasons, 
    UNIX_TIMESTAMP(start_date) AS start_dateStamp, 
    UNIX_TIMESTAMP(end_date) AS end_dateStamp 
FROM `offers` 
WHERE `club_id` = 23 
    AND `start_date`) < UNIX_TIMESTAMP(1329308797) 
    AND (`end_date` > UNIX_TIMESTAMP(1329308797) OR `end_date` = "0000-00-00") 

いくつかの注意:

  1. あなたは理由がある場合を除き*を使用しないでください。
  2. あなたのコードを読みやすいようにフォーマットしようとします。
  3. あなたの条件を並べ替えることで、最も少ないレコードを選択する条件が読めます。これは、MySQLのオプティマイザをほのめかしよりも精神的なものとなっています、それはまだあなたが(日付)を比較すれば、私は
  4. に固執したい条約の範囲、col BETWEEN min_val and max_val(境界は含まれています)の使用を検討
  5. の関数を使用していませんWHEREおよびGROUP BY句。 MySQLはこれらをキャッシュ/インデックス化することはできず、そのため、その関数を通して各行の値を実行する必要があります。 UNIX_TIMESTAMP()には、FROM_UNIXTIME()という名前のフレンドがあります。あなたはPHPでdate()であなた自身ができないことは何もありません。
  6. 値が不明な場合は、フィールドをNULLに設定することを検討してください。日付があるか(2012-02-15)、そうでないか(NULL)です。それで簡単にあなたの質問を確認することができますOR end_date IS NULL
0

これはあなたが欲しいものですか?

SELECT * 
    , UNIX_TIMESTAMP(start_date) AS start_dateStamp 
    , UNIX_TIMESTAMP(end_date) AS end_dateStamp 
FROM 
    `offers` 
WHERE 
    (UNIX_TIMESTAMP(`start_date`) < 1329308797 AND UNIX_TIMESTAMP(`end_date`) > 1329308797) 
    OR 
    (`club_id` = 23 AND `end_date` = '0000-00-00 00:00:00') 
関連する問題