2

MYSQL 関連の問題をもう一度解決しようとしています。最初は単純に聞こえますが、今では頭痛の種になっています。私は多数のスニペットを読み、数日間実験しましたが、残念ながら、完璧な解決策を見つけるという点ではあまり成功していません.

私は2つのテーブルを持っています。最初のテーブルには通話が含まれており、各通話は最初のテーブルの行で表され、次の 3 つの列があります。

p_key (INT)、call_date (DATE)、call_time (TIME)

2 番目のテーブルには特定のイベントが含まれており、これも 3 つの列があります。

event_id (INT)、event_start (DATETIME)、event_end (DATETIME)

最初のテーブル (呼び出しテーブル) から、同じ日付のイベント テーブルの開始と終了の間の時間内に収まらないエントリのみをカウントしたいと思います。

私の主な問題は、単一の日付に対してイベント テーブルに複数のエントリが存在する可能性があることです (例: 0800 から 1000 までのイベントと、同じ日の 1400 から 1600 までの別のイベント )。それ以外の場合は、単純に BETWEEN 構文を使用できます。

私はそれがこれに影響を与える何かかもしれないと思います:

SELECT
SUM(
   CASE WHEN t1.p_key != 0  
   THEN 1 ELSE 0 END
) AS brt,
SUM(
   CASE WHEN t1.p_key != 0  
    AND t1.call_time NOT BETWEEN TIME(t2.event_start) AND TIME(t2.event_end)
   THEN 1 ELSE 0 END
) AS net


FROM call_table t1 INNER JOIN event_table t2
ON t1.call_date = DATE(t2.event_start)
WHERE t1.call_date >= '2013-09-01'
AND t1.call_date <= '2013-09-30'
GROUP BY DAY(t1.call_date)

残念ながら、このクエリは結果を返しません。

誰かが私を大まかな方向に向けることができますか?

PsここのSOの投稿でサンプルテーブルデータをフォーマットする方法に関する参照を見つけようとしましたが、私は盲目であるか、特定の参照がありません。きれいにフォーマットされたテーブル データの例を見たので、それが可能であることを知っているので、それに関する追加の手がかりも非常に高く評価されます。

UPDATE INNERの代わりにLEFT JOINを使用して、出力を得ることができました。私は MySQL の専門家ではないので、結果が正しければ手で数えます。

4

2 に答える 2

1

クエリは次のようになります

SELECT 
  TIMESTAMP(call_date, call_time)
FROM 
  calls 
  LEFT JOIN events 
    ON TIMESTAMP(call_date, call_time)>event_start 
    AND timestamp(call_date, call_time)<event_end 
WHERE 
  event_start IS NULL

-このフィドルを参照してください。

結果をカウントするには、次のようにします

SELECT 
  COUNT(calls.id)
FROM 
  calls 
  LEFT JOIN events 
    ON TIMESTAMP(call_date, call_time)>event_start 
    AND timestamp(call_date, call_time)<event_end 
WHERE 
  event_start IS NULL
于 2013-10-07T11:04:06.390 に答える
1

次のようなことを試してください:

SELECT *
FROM call_table t1
WHERE NOT EXISTS (
    SELECT * FROM event_table t2
    WHERE TIMESTAMP(t1.date, t1.time) BETWEEN t2.event_start AND t2.event_end)
)

これにより、event_table のイベント開始日と終了日の間に収まらない call_table のすべてのレコードが得られます。必要に応じて、独自の where-criteria および/または count() 関数を追加します。

于 2013-10-07T10:58:29.190 に答える