0

少し複雑なクエリを実行しようとしていますが、期待されるデータを取得していない結合の 1 つを除いて、必要なものはほとんどあります。

私の試み

SELECT email.*, email_type.*, email_subtype.*, email_dailytotal.*, SUM(email_dailytotal.fullconversions - (email_dailytotal.duplicates + email_dailytotal.invalids)) as validleads, email_week.*, SUM(adjustment) as total_adjustment, email_costmethod.*
FROM email 
LEFT JOIN email_type on email.type = email_type.type_id
LEFT JOIN email_subtype on email_subtype.type_id = email_type.type_id 
LEFT JOIN email_dailytotal on email_dailytotal.email_id = email.email_id 
LEFT JOIN email_week on email_week.email_id = email.email_id 
LEFT JOIN email_costmethod on email_costmethod.costmethod_id = email.costmethod
WHERE email.email_id = '12163'
AND business IN ("group", "dead") 
AND agency="MFC" 
AND start_date >="2013-02-01" 
GROUP BY email.email_id, email_dailytotal.oeyearno
ORDER BY email.email_id DESC

email_dailytotalに参加するときを除いて、私はほとんど欲しいものを手に入れますemail

LEFT JOIN email_dailytotal on email_dailytotal.email_id = email.email_id 

email_dailytotalそのキャンペーンのすべての行ではなく、1 つの行のみを取得するためです。

これは、次の基本的なクエリで実行できます。

SELECT SUM(fullconversions) FROM email_dailytotal WHERE email_id = 12163

結果はどこにあり27ますが、全体的なクエリでは、たまたま最初の行を取得します1

の最小化された構造email_dailytotalは次のとおりです。

email_id | fullconversions  | summarydate |

したがって、キャンペーンの各日のデータが含まれています。

12163 |  1 | 2013-02-27
12163 | 10 | 2013-02-26
12163 | 15 | 2013-02-25
12163 |  1 | 2013-02-22

したがって、私の結合では、合計ではなく最後の行を取得しています。

誰かが私が間違っているところを指摘できますか?

PSこの質問の混乱をお詫びします。sqlfiddleを作成しようとしましたが、ビルドスキーマが8000文字を超えていたため機能しませんでした。誰かが答えるのに役立つ場合は、以下に含めました。

通常はテーブルの構造を表示しますが、適切な標準にフォーマットするには何時間もかかります。

データ

http://pastebin.com/NV0nAwrp

4

1 に答える 1

1

基本的な問題は、あなたのSELECT節とあなたのGROUP BY節が矛盾していることです。

手始めに、次のように変更してみてください。

SELECT email.email_id,
  SUM(email_dailytotal.fullconversions - (email_dailytotal.duplicates + email_dailytotal.invalids)) as validleads, 
  SUM(adjustment) as total_adjustment
...
GROUP BY email.email_id

ONLY_FULL_GROUP_BYMySQL でそのようなクエリを実行させないように、sql_modeを使用することもお勧めします。

于 2013-03-08T16:10:29.733 に答える