Подсчет различных полей в таблице 2 из различных идентификаторов в таблице 1 в SQL (MySQL) - PullRequest
0 голосов
/ 24 марта 2011

У меня есть 2 таблицы:

Таблица 1:

| order_id | shop_id | customer_id | total |  date    |
-------------------------------------------------------
|   9005   |    A    |      1      | 1205  | 20110210 |
|   9006   |    A    |      2      | 8591  | 20110212 |
|   9007   |    A    |      2      | 3472  | 20110216 |
|   9008   |    B    |      1      | 6310  | 20110218 |
-------------------------------------------------------

Таблица 2:

| shop_id | customer_id | reference |
-------------------------------------
|    A    |      1      | Friend    |
|    A    |      2      | Internet  |
|    B    |      1      | Friend    |
|    C    |      1      | Friend    |
-------------------------------------

Я хочу выбрать различные значения (shop_id, customer_id) изtable1 (фильтруется по дате), а затем подсчитывает ссылки в таблице 2.

Ожидаемый результат:

| reference | count |
---------------------
|  Friend   |   2   |
|  Internet |   1   |
----------------------

Пока что я использую запрос:

ВЫБЕРИТЕ ссылку, COUNT (*) в качестве счетчика FROM table1 JOIN table2 USING (shop_id, customer_id) GROUP BY reference

И результат:

| reference | count |
---------------------
|  Friend   |   2   |
|  Internet |   2   |
---------------------

Проблема заключается в том, что счет идет 2 раза: shop_id = A и customer_id = 2.Вот почему «Интернет» учитывается дважды.

Может ли кто-нибудь помочь мне определить, что не так?Если возможно, я бы хотел добиться этого без использования подзапросов (техническое ограничение).

Спасибо.

Дамп SQL:

CREATE TABLE `table1` (
   `order_id` int(11),
   `shop_id` char(1),
   `customer_id` int(11),
   `total` smallint(6),
   `date` date
);

INSERT INTO `table1` (`order_id`, `shop_id`, `customer_id`, `total`, `date`) VALUES 
('9005', 'A', '1', '1205', '2011-02-10'),
('9006', 'A', '2', '8591', '2011-02-12'),
('9007', 'A', '2', '3472', '2011-02-16'),
('9008', 'B', '1', '6310', '2011-02-18');

CREATE TABLE `table2` (
   `customer_id` int(11),
   `shop_id` char(1),
   `reference` enum('Friend','Internet')
);

INSERT INTO `table2` (`customer_id`, `shop_id`, `reference`) VALUES 
('1', 'A', 'Friend'),
('2', 'A', 'Internet'),
('1', 'B', 'Friend'),
('1', 'C', 'Friend');

Ответы [ 2 ]

1 голос
/ 29 мая 2013

Я думаю, что это может сработать для вас - по крайней мере, это возвращает ожидаемый результат

SELECT reference,COUNT(distinct(concat(shop_id,'_',customer_id))) as count 
FROM table1 JOIN table2 USING(shop_id,customer_id) GROUP BY reference;

'_' - во избежание смешивания store_id и customer_id, вы можете использовать другую функцию хеширования для создания уникального идентификатора магазина / клиента

0 голосов
/ 24 марта 2011

Это одно решение с использованием подзапросов:

SELECT reference, COUNT(*) as count FROM (SELECT shop_id,customer_id,reference FROM table1 JOIN table2 USING(shop_id,customer_id) GROUP BY shop_id,customer_id) as filtered GROUP BY(reference)

Но я бы предпочел не использовать подзапросы ... Если такой альтернативы нет, это станет правильным ответом.

...