1

2 つのデータベース間のタイム スタンプをカウントしようとしていますが、私の設計上の欠陥ではないため、タイム スタンプが重複しています。

SELECT date(time + INTERVAL 8 HOUR) as day, COUNT(DISTINCT comment)
FROM  news.data
GROUP BY day
    UNION ALL
SELECT date(time + INTERVAL 8 HOUR) as day, COUNT(DISTINCT comment)
FROM`news-backup`.`data`
GROUP BY day
ORDER BY year(day) desc, day(day) DESC
LIMIT 20

どうやら、両方のデータベースの範囲内にいくつかのタイムスタンプがあるため、特定の日付に対して別々のカウントが生成されます。したがって、news と news-backup から TODAY のカウントが得られます。

EX:
date      count
2013-1-15  10
2013-1-15  13
2013-1-14  8
2013-1-13  15

私が欲しいのは

EX:
date      count
2013-1-15  23
2013-1-14  8
2013-1-13  15

これがキッカーです。ビューで必要なので、いくつかの制限があります (サブクエリは許可されません)。考え?いいえ、DB間で発生するデータダンプシーケンスを変更することはできません

4

1 に答える 1

0

サブクエリをビューに入れることはできませんが、ビューをビューに入れることはできます。

そう:

create view1 as 
    SELECT date(time + INTERVAL 8 HOUR) as day, 'current' as which, COUNT(DISTINCT comment) as cnt
    FROM  news.data
    GROUP BY day
        UNION ALL
    SELECT date(time + INTERVAL 8 HOUR) as day, 'backup' as which, COUNT(DISTINCT comment) as cnt
    FROM`news-backup`.`data`
    GROUP BY day, which

それらを組み合わせる論理が何であるかはわかりません:

create view2 as
    select day, max(cnt)  -- sum(cnt)?  prefer current or backup?
    from view1
    group by day
    ORDER BY day desc

サブクエリを禁止するドキュメントはこちらです。必ず「SELECT ステートメントに次を含めることはできません」を検索してください。

すべての日付のテーブルがある場合、次の「ばかげた」SQL が機能する可能性があります。

select c.date,
       coalesce( (select count(distinct comment) from news.data where date(time + INTERVAL 8 HOUR) = c.date),
                 (select count(distinct comment) from news_backup.data where date(time + INTERVAL 8 HOUR) = c.date)
               ) as NumComments
from calendar c

このバージョンでは、最初に「新規」、次にバックアップが必要であると想定しています。合計が必要な場合は、それらを追加します。

于 2013-01-15T15:02:19.760 に答える