4

そのため、システム内のレストランごとのリピート注文の量を計算しようとしています。これは、そのレストランから 2 回以上注文した (メール アドレス eo_email に基づく) ユーザーの数として定義されます。スキーマの下の例

これが私のレストランを表すテーブルです

CREATE TABLE IF NOT EXISTS `lf_restaurants` (
  `r_id` int(8) NOT NULL AUTO_INCREMENT,
  `r_name` varchar(128) DEFAULT NOT NULL,
  PRIMARY KEY (`r_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;

INSERT INTO `lf_restaurants` (`eo_id`, `eo_ref_id`) VALUES
('1', 'Restaurant X'),
('2', 'Cafe Y');

これが私の注文表です

CREATE TABLE IF NOT EXISTS `ecom_orders` (
  `eo_id` mediumint(9) NOT NULL AUTO_INCREMENT,
  `eo_ref_id` varchar(12) DEFAULT NOT NULL,
  `eo_email` varchar(255) DEFAULT NOT NULL,
  `eo_order_parent` int(11) NOT NULL,
  PRIMARY KEY (`eo_id`),
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 ;

INSERT INTO `ecom_orders` (`eo_id`, `eo_ref_id`, `eo_email`, `eo_order_parent`) VALUES
('', '', 'a@a.com', '1'),
('', '', 'a@a.com', '1'),
('', '', 'a@a.com', '1'),
('', '', 'a@a.com', '1'),
('', '', 'a@a.com', '1'),
('', '', 'b@b.com', '1'),
('', '', 'b@b.com', '1'),
('', '', 'c@c.com', '1'),
('', '', 'd@d.com', '1'),
('', '', 'e@e.com', '1'),
('', '', 'a@a.com', '2'),
('', '', 'c@c.com', '2'),
('', '', 'c@c.com', '2'),
('', '', 'e@e.com', '2');

したがって、レストラン X (r_id 1) には 10 件の注文があります。ユーザー a@a.com と b@b.com はそのレストランに複数回注文しており、c@c.com、d@d.com、e@e.com は 1 回しか注文していないため、返す必要があります。 40%

カフェ Y (r_id 2) には 4 つの注文があります。ユーザー c@c.com は 2 回注文しましたが、ユーザー a@a.com と e@e.com は 1 回だけ注文したため、33% を返す必要があります。

「サブクエリに複数の結果があります」に遭遇し続けるか、そのサブクエリを独自のダミークエリでカウント付きでラップすると、フィールドを使用できなくなります。 r_id などのメイン クエリから必要です。しかし、ここに行きます:

SELECT r_name,
    (SELECT COUNT(*) AS cnt_users
        FROM (
            SELECT *
            FROM ecom_orders
            WHERE eo_order_parent = r_id
            GROUP BY eo_email
        ) AS cnt_dummy
    ) AS num_orders,
    (SELECT COUNT(*) AS cnt
        FROM ecom_orders
        WHERE eo_order_parent = r_id
        GROUP BY eo_order_parent, eo_email

    ) AS num_rep_orders
    FROM lf_restaurants
    ORDER BY num_orders DESC

num_orders サブクエリは、r_id を認識しないと言っています。これは、物事が実行される順序によるものだと推測しています。

num_rep_orders サブクエリは複数の行として返されますが、実際には、num_orders サブクエリのように作成した場合に実行できる単一の値だけで返されるようにしたいのですが、r_id が存在しないという問題が発生します。

だから私の質問は次のとおりです。サブクエリに遭遇せずに必要なこれらの値を取得するにはどうすればよいですか?複数の行があり、r_id が存在しませんか?

次に、これらの2つの値からパーセンテージを計算でき、すべてが肉汁になるはずです:)どんな助けも大歓迎です!

4

2 に答える 2

2

したがって、レストラン X (r_id 1) には 10 件の注文があります。ユーザー a@a.com と b@b.com はそのレストランに複数回注文しており、c@c.com、d@d.com、e@e.com は 1 回しか注文していないため、返す必要があります。 40%

カフェ Y (r_id 2) には 4 つの注文があります。ユーザー c@c.com は 2 回注文しましたが、ユーザー a@a.com と e@e.com は 1 回だけ注文したため、33% を返す必要があります。

わかった。それでは、リピーターの数を取得することから始めましょう。

SELECT eo_order_parent, eo_email, COUNT(eo_email) AS orders FROM ecom_orders
    GROUP BY eo_order_parent, eo_email
    HAVING orders > 1;

そして、さまざまな顧客の総数

SELECT eo_order_parent, COUNT(eo_email) FROM ecom_orders
    GROUP BY eo_order_parent;

しかし、これを一度に行うことができます:

SELECT eo_order_parent,
    SUM(CASE WHEN orders > 1 THEN 1 ELSE 0 END) AS repeats,
    SUM(1) AS total FROM
    (
        SELECT eo_order_parent, eo_email, COUNT(*) AS orders FROM ecom_orders
            GROUP BY eo_order_parent, eo_email
    ) AS eo_group_1
GROUP BY eo_order_parent;

これは与える:

+-----------------+---------+-------+
| eo_order_parent | repeats | total |
+-----------------+---------+-------+
|               1 |       2 |     5 |
|               2 |       1 |     3 |
+-----------------+---------+-------+
2 rows in set (0.00 sec)

5 分の 2 は 40%、3 分の 1 は 33% です。

于 2012-09-12T13:43:34.043 に答える
1

次のクエリは、リピート顧客の数とレストランごとの顧客の総数を計算します

SELECT
  u.r_id,
  u.r_name,
  SUM(u.no_orders > 1) AS repeats,
  SUM(u.no_orders) AS orders,
  COUNT(u.eo_email) AS customers
FROM (
    SELECT
      r.*,
      o.eo_email,
      COUNT(o.eo_id) AS no_orders
    FROM lf_restaurants r
    LEFT JOIN ecom_orders o ON o.eo_order_parent = r.r_id
    GROUP BY o.eo_email
) u
GROUP BY
  r.r_id;

サブクエリは、最初に顧客/レストランのペアごとの注文数を計算します。外側のクエリは、これから顧客数、リピート顧客数、レストランごとの顧客総数を計算します。パーセンテージを計算することもできます (ただし、クエリでこれを行う必要はありません)。

于 2012-09-12T13:55:56.457 に答える