0

複雑な質問を受けました。

複数のテーブルのデータを結合するクエリがあります。例えば:

traffic: id, traffic_source_id, first_hit_date
goals: id, goal_type, goal_date, goal_value
traffic_sources: id, source_name

goal_type は「お問い合わせフォーム」、「デモのダウンロード」、「購入」のいずれかです。goal_value は数値です。ユーザーが同じ日付 (日) に目標を達成した回数を表示します。

各 traffic_id に対して 1 つの行を表示し、この traffic_id のすべての目標を合計しようとしています。ユーザーが初めて訪れたとき、彼/彼女は彼と一緒にいるトラフィック ID (Cookie) を取得します。たとえば、最初のヒット日から 1 週間後に目標を達成し、2 日後に別の目標を達成することができます。

from date > to date をクエリして、その特定の範囲の目標の正しい合計値を表示できるようにしたいと考えています。SUM(CASE WHEN ...) を使用しようとすると、目標テーブル内の範囲だけを合計できません。

例: 2 月 1 日から 2 月 28 日までのトラフィック

3 | google adwords | 0 contact | 1 demo download | 1 purchase
4 | facebook       | 1 contact | 3 demo download | 3 purchase

しかし、範囲を2月1日から2月14日に変更したい場合

3 | google adwords | 0 contact | 1 demo download | 0 purchase
4 | facebook       | 0 contact | 2 demo download | 2 purchase

私が十分に明確であることを願っています...

どんなアドバイスでも大歓迎です。


更新:私が今持っているもののクエリの例:

SELECT traffic.traffic_id as original_traffic_id hit_date, referrer, referrer_url, keyword, ip,
SUM(CASE goals.goal_type WHEN 'Contact' THEN 1 ELSE 0 END) goal_contact,
SUM(CASE goals.goal_type WHEN 'Download' THEN 1 ELSE 0 END) goal_download,
SUM(CASE goals.goal_type WHEN 'Signup' THEN 1 ELSE 0 END) goal_signup,
SUM(CASE goals.goal_type WHEN 'Purchase' THEN 1 ELSE 0 END) goal_purchase
FROM traffic
LEFT JOIN goals ON goals.traffic_id = traffic.traffic_id
WHERE traffic.traffic_id=100 AND hit_date >= '$from_date' AND hit_date <= '$to_date'

(ここで、$from_date と $to_date は mysql の日付形式です)

(これは実際のクエリではありません。元のクエリははるかに大きく、結合するテーブルがさらに 7 つ含まれているためです)。SUM を $from_date と $to_date の範囲に制限できるようにしたい

それがもう少しクリアされることを願っています。

4

1 に答える 1

0

これに対する答えはまだありませんが、私が行ったことは、最初のクエリの前に別のクエリですべての目標を要約することです。配列は次のようになります$goals_array[traffic_id][goal_type] -> value

そして、メインの SQL をループしながら、$goals_array から値をフェッチするだけです。高速に動作し、これを 1 つのクエリで実行したいのですが、今のところ問題ありません。

于 2012-04-18T07:25:33.473 に答える