1

たぶん、これはレベル 3 の児童書のように見える MySQL マスターの一部にとっては簡単なものになるでしょう。

レポートの統計データを生成するために結合している複数のテーブルがあり、現在それを理解しようとしてつまずいています。今後の多くの決定に影響を与えるため、数値が正確であることは明らかに不可欠です。

これが土地のレイアウトです(全体像ではありませんが、要点はわかります):

アフィリエイト テーブル

+----+-----------+------------+---------------------+
| id | firstname | lastname   | created_date        |
+----+-----------+------------+---------------------+
|  1 | Mike      | Johnson    | 2010-11-22 17:44:37 |
|  2 | Trevor    | Wilson     | 2010-12-23 16:24:24 |
|  3 | Bob       | Parker     | 2011-11-04 10:33:49 |
+----+-----------+------------+---------------------+

ここで、クエリは Bob Parker (id 3) の結果のみを見つける必要があるため、Bob の結果の例のみを示します。

アフィリエイト リンク テーブル

+-----+-----------+--------------+-----------+----------+---------------------+
| id  | parent_id | affiliate_id | link_type | linkhash | created_date        |
+-----+-----------+--------------+-----------+----------+---------------------+
|  21 |      NULL |            3 | PRODUCT   | fa2e82a7 | 2011-06-15 16:18:37 |
|  27 |      NULL |            3 | PRODUCT   | 55de2ae7 | 2011-06-23 01:03:00 |
|  28 |      NULL |            3 | PRODUCT   | 02cae72f | 2011-06-23 01:03:00 |
|  29 |        27 |            3 | PRODUCT   | a4dfb2c8 | 2011-06-23 01:03:00 |
|  30 |        28 |            3 | PRODUCT   | 72cea1b2 | 2011-06-23 01:03:00 |
|  36 |        21 |            3 | PRODUCT   | fa2e82a7 | 2011-06-23 01:07:03 |
|  59 |        21 |            3 | PRODUCT   | ec33413f | 2011-11-04 17:49:17 |
|  60 |        27 |            3 | PRODUCT   | f701188c | 2011-11-04 17:49:17 |
|  69 |        21 |            3 | PRODUCT   | 6dfb89fd | 2011-11-04 17:49:17 |
+-----+-----------+--------------+-----------+----------+---------------------+

アフィリエイト統計

+--------+--------------+--------------------+----------+---------------------+
| id     | affiliate_id | link_id | order_id | type     | created_date        |
+--------+--------------+---------+----------+----------+---------------------+
|  86570 |            3 |      21 |     NULL | CLICK    | 2013-01-01 00:07:31 |
|  86574 |            3 |      21 |     NULL | PAGEVIEW | 2013-01-01 00:08:53 |
|  86579 |            3 |      21 |      411 | SALE     | 2013-01-01 00:09:52 |
|  86580 |            3 |      36 |     NULL | CLICK    | 2013-01-01 00:09:55 |
|  86582 |            3 |      36 |     NULL | PAGEVIEW | 2013-01-01 00:09:56 |
|  86583 |            3 |      28 |     NULL | CLICK    | 2013-01-01 00:11:04 |
|  86584 |            3 |      28 |     NULL | PAGEVIEW | 2013-01-01 00:11:04 |
|  86586 |            3 |      30 |     NULL | CLICK    | 2013-01-01 00:30:18 |
|  86587 |            3 |      30 |     NULL | PAGEVIEW | 2013-01-01 00:30:20 |
|  86611 |            3 |      69 |     NULL | CLICK    | 2013-01-01 00:40:19 |
|  86613 |            3 |      69 |     NULL | PAGEVIEW | 2013-01-01 00:40:19 |
|  86619 |            3 |      69 |      413 | SALE     | 2013-01-01 00:42:12 |
|  86622 |            3 |      60 |     NULL | CLICK    | 2013-01-01 00:46:00 |
|  86624 |            3 |      60 |     NULL | PAGEVIEW | 2013-01-01 00:46:01 |
|  86641 |            3 |      60 |     NULL | PAGEVIEW | 2013-01-01 00:55:58 |
|  86642 |            3 |      30 |      415 | SALE     | 2013-01-01 00:56:35 |
|  86643 |            3 |      28 |     NULL | PAGEVIEW | 2013-01-01 00:56:43 |
|  86644 |            3 |      60 |      417 | SALE     | 2013-01-01 00:56:52 |
+--------+--------------+---------+----------+----------+---------------------+

注文

+------+--------------+---------+---------------------+
| id   | affiliate_id | total   | created_date        |
+------+--------------+---------+---------------------+
|  411 |            3 |  138.62 | 2013-01-01 00:09:50 |
|  413 |            3 |  312.87 | 2013-01-01 00:09:52 |
|  415 |            3 |  242.59 | 2013-01-01 00:09:55 |
|  417 |            3 |  171.18 | 2013-01-01 00:09:55 |
+------+--------------+---------+---------------------+

必要な結果は次のようになります (メイン/親リンク ID のみを表示)

+---------+---------+
| link_id | total   |
+---------+---------+
|      21 |  451.49 | <- 1 order from parent (21), 1 from child (69)
|      27 |  171.18 | <- 1 order from child (69)
|      28 |  242.59 | <- 1 order from child (30)
+---------+---------+

私は、affiliate_link.id とaffiliate_link.parent_id が組み合わされた場所を合計できるように、クエリをどのように作成するのかよくわかりません。これは、いくつかの JOIN と GROUPing でも可能ですか?

4

1 に答える 1

0

なぜあなたが非正規化したのかaffiliate_id(各テーブルに配置することによって)、したがって、特定のリンクに由来するすべての統計と注文がaffiliate_idそのリンクと同じであることに依存できるかどうかはよくわかりません.

可能であれば、親レコードが (ではなく)AffiliateLink.parent_id自分自身を指すように列を変更することをお勧めします。NULL

UPDATE AffiliateLink SET parent_id = id WHERE parent_id IS NULL

次に、結合とグループ化の単純なケースです。

SELECT   AffiliateLink.parent_id AS link_id,
         SUM(Orders.total) AS total
FROM     AffiliateLink
    JOIN AffiliateStats ON AffiliateStats.link_id = AffiliateLink.id
    JOIN Orders         ON Orders.id = AffiliateStats.order_id
WHERE    AffiliateLink.affiliate_id = 3
GROUP BY AffiliateLink.parent_id

sqlfiddleで参照してください。

AffiliateLink変更を行うことができない場合は、次を使用して結果のテーブルを効果的に作成できますUNION(ただし、MySQL は結果に対してインデックスを使用できないため、パフォーマンスへの影響に注意してください)。

(
  SELECT parent_id, id, affiliate_id FROM AffiliateLink WHERE parent_id IS NOT NULL
UNION ALL
  SELECT id       , id, affiliate_id FROM AffiliateLink WHERE parent_id IS NULL
) AS AffiliateLink

sqlfiddleで参照してください。

于 2013-01-22T07:48:12.687 に答える