4

これは私の現在のクエリです

SELECT DAYNAME(date_created) AS Day, 
COUNT(*) AS my_count FROM sometable 
WHERE (@date_created >= '2010-10-20 21:02:38' OR @date_created IS NULL) 
AND (@date_created <= '2010-10-27 21:02:38' OR @date_created IS NULL) 
GROUP BY DAY(date_created)

カウントが存在する場合、その日のデータのみが返されます。

私はifnullをいじっていましたが、運はありません

これは簡単だと思いますが、わかりません!

どんな助けでも大歓迎です

4

5 に答える 5

1

COALESCEを使用する:

SELECT COALESCE(x、0)AS val FROM table;

xがnullの場合、0を返します

于 2010-11-02T07:34:24.943 に答える
0

MySQL実行時にレコードセットを生成する方法がありません (のようgenerate_seriesPostgreSQL)。

このクエリを実行する唯一の方法は、考えられるすべての日付のテーブルを保持することです (または、クロス結合できる小さなテーブルを使用することをお勧めします)。

CREATE TABLE a (a INT PRIMARY KEY);

INSERT
INTO    a
VALUES
        (0),
        (1),
        …
        (99)

次に、可能なすべての日付のリストを生成し、それをテーブルに結合します。

SLEECT  '2010-01-01' + INTERVAL 10000 * a1.a + 100 * a2.a + a3.a DAY AS dt,
        COUNT(date_created)
FROM    a a1
CROSS JOIN
        a a2
CROSS JOIN
        a a3
LEFT JOIN
        sometable
ON      date_created = '2010-01-01' + INTERVAL 10000 * a1.a + 100 * a2.a + a3.a DAY
WHERE   (a1.a, a2.a, a3.a) <= (0, 3, 65)
GROUP BY
        dt

この条件:

(a1.a, a2.a, a3.a) <= (0, 3, 65)

「365 レコードを取る」という意味です。

于 2010-10-27T12:03:25.190 に答える
0

@ 記号はユーザー変数を表します - sometable から date_created をプルしていますか? その場合は、変数から @ 記号を削除します。

nullの場合、date_createdを含める理由がわかりません。おそらく、いくつかのサンプル行と目的の出力が、探しているものを正確に示すのに役立つでしょう。幸運を!:)

于 2010-10-30T11:04:35.297 に答える
0

@ を使用するときは一貫性を保つ

于 2010-12-09T13:40:19.970 に答える
0

ようこそダグ!SQL の修正版をローカルで実行したところ、これらの NULL 日付でも結果が得られました。まず最初に - null を他の値にリアルタイムで変換するには (「null を 0 に変換」)、MySQL ステートメントIFを使用する必要があります。Oracle について何か知っている場合は、DECODEコマンドによく似ています。NULL 値は自動的に false と評価されるため、次のように簡単に記述できます。

SELECT IF(date_created,date_created,0) FROM sometable

もちろん... 0 はもはや日付ではなく、NULL は日付です。DAYNAMEこの関数は、対処するために NULL 日付を渡すだけであることがわかりました。

SELECT DAYNAME(date_created) day,COUNT(*) my_count 
FROM sometable
WHERE date_created IS NULL OR
 (date_created>='2010-10-20 21:02:38' AND date_created <= '2010-10-27 21:02:38')
GROUP BY DAY(date_created)

私がそれから得ているのは(データセットの例で)、次の8つの値ですday:7日+ NULL(カウント付き)。これはちょっと理にかなっています...不明な日付を曜日に変換することはできません。

@私があなたの目的を誤解していない限り、それはあなたのSQLの誤った兆候だった可能性があります。

アップデート

最後のコメントに基づいて、PHP で処理を引き継ぐ必要があります。事前に日の配列を作成し、MySQL データを既存の配列に追加して、すべての日が (そして順番に) 存在するようにします。

出典PHPでの日数カウント

//You may not even need "date_created IS NULL OR" in the where statement
$sql="SELECT DAYNAME(date_created) day,COUNT(*) my_count 
    FROM sometable
    WHERE date_created IS NULL OR
     (date_created>='2010-10-20 21:02:38' 
      AND date_created <= '2010-10-27 21:02:38')
    GROUP BY DAY(date_created)";
//We're assuming you've setup a MySQL connection in $conn
$result = @mysql_query($sql, $conn) or die(mysql_error());

//Starting data - Zero for every day
$days=array("Sunday"=>0,"Monday"=>0,"Tuesday"=>0,"Wednesday"=>0,
   "Thursday"=>0,"Friday"=>0,"Saturday"=>0);
while($row = mysql_fetch_array($result)) {
   $days[$row["day"]]+=$row["my_count"];
}
mysql_free_result($result);

//Preview the output
print_r($days);
于 2010-10-27T13:51:09.307 に答える