4

私は3つのテーブルを持っています:

file_list => list of all files on web server  
stats_web => number of pageviews from public web  
stats_reg => number of pageviews from "registered users" 

http://sqlfiddle.com/#!2/98c6a/1/0にスキーマといくつかのサンプルデータがあります

一般のユーザーまたは登録ユーザーがファイルを最初にヒットした日付を計算しようとしています。

現在のSQLは次のようになります。

SELECT
    list.path,
    list.mod_date,
    IF(MIN(ifnull(web.hit_date, 0000-00-00)) < MIN(ifnull(reg.hit_date, 0000-00-00)), MIN(ifnull(web.hit_date, 0000-00-00)), MIN(ifnull(reg.hit_date, 0000-00-00))) AS 'min_date',
    IF(MAX(ifnull(web.hit_date, 0000-00-00)) > MAX(ifnull(reg.hit_date, 0000-00-00)), MAX(ifnull(web.hit_date, 0000-00-00)), MAX(ifnull(reg.hit_date, 0000-00-00))) AS 'max_date',    
    SUM(ifnull(web.pages, 0)) + SUM(ifnull(reg.pages, 0)) AS 'page_views'
FROM
    file_list list
    LEFT JOIN
         stats_web web ON list.path = web.path
    LEFT JOIN
         stats_reg reg ON list.path = reg.path
WHERE
list.path LIKE '/web/htdocs/%'
GROUP BY list.path;

問題は、レコードが統計テーブルの1つにのみ表示される場合、最小日付は常に0であるということです。これは、MINとMAXのifnull()が原因ですが、ifnull()を使用しない場合は、minとmaxの両方です。日付はNULLを返します。

4

1 に答える 1

1

ifnull最小値を比較するために使用されるときの2番目の引数には、遠い将来の日付を使用する必要があります。そうでなければ、最初null0000-00-00日付が最小になり、それが可能な限り早い日付であるため、他の日付が最小になるためにそれを打ち負かすことはできません。

クエリの4行目を次のように変更した場合

IF(MIN(ifnull(web.hit_date, 9999-12-31)) < MIN(ifnull(reg.hit_date, 9999-12-31)), MIN(ifnull(web.hit_date, 9999-12-31)), MIN(ifnull(reg.hit_date, 9999-12-31))) AS 'min_date'

正しい結果が得られるはずです。

于 2012-07-10T03:38:36.770 に答える