MySQL ГРУППИРУЕТСЯ по нескольким столбцам из разных таблиц

#mysql

#mysql

Вопрос:

У меня есть следующие макеты таблиц:

 Table Data
 ---------- ------------------------- 
| Field    | Type                    |
 ---------- ------------------------- 
| type     | enum('type_b','type_a') |
| type_id  | int(11) unsigned        |
| data     | bigint(20) unsigned     |
 ---------- ------------------------- 

Table A and B:

 -------------- ------------------ 
| Field        | Type             |
 -------------- ------------------ 
| id           | int(11) unsigned |
| customer_id  | int(11) unsigned |
| ...                             |
 -------------- ------------------ 
  

В табличных данных есть некоторые данные о беспорядке определенного типа (a или b).
Теперь я хочу, чтобы каждый клиент получал общую сумму для обоих типов данных a и b.

Итак, я подумал: выберите сумму, объедините по a или b и сгруппируйте по a.customer_id, b.customer_id.

Результатом является следующий запрос:

 SELECT sum(d.data) as total
FROM data d, ta, tb
WHERE
(d.type LIKE "type_a" AND d.type_id = ta.id) 
OR 
(d.type LIKE "type_b" AND d.type_id = tb.id) 
GROUP BY ta.customer_id, tb.customer_id;
  

Это не дает мне надлежащих результатов…

Я попробовал несколько подходов, объединение по левому краю, объединение в таблице customer и группирование по customer.id и т.д. Кто-нибудь знает, что я делаю не так?

Спасибо!

Комментарии:

1. где псевдонимы таблиц? «ta как a», «tb как b»

2. ах, вы правы 🙂 это не фактический запрос, а упрощенный. Исправлено.

Ответ №1:

Ваш запрос

 SELECT sum(d.data) as total
FROM data d, ta, tb
WHERE
(d.type LIKE "type_a" AND d.type_id = ta.id) 
OR 
(d.type LIKE "type_b" AND d.type_id = tb.id) 
GROUP BY a.customer_id, b.customer_id;
  

Допустим, в d есть только одна запись, и это type_a. В ta и tb есть по две записи в каждой. Запись в d совпадает с одной из записей в ta on d.type_id=ta.id . Следовательно, эта комбинация (d x ta) позволяет ЛЮБОЙ записи tb остаться в конечном результате. Вы получаете непреднамеренное декартово произведение.

 SELECT x.customer_id, SUM(data) total
FROM
(
    SELECT ta.customer_id, d.data
    FROM data d JOIN ta
       ON (d.type LIKE "type_a" AND d.type_id = ta.id) 
    UNION ALL
    SELECT tb.customer_id, d.data
    FROM data d JOIN tb
       ON (d.type LIKE "type_b" AND d.type_id = tb.id) 
) X
GROUP BY x.customer_id;
  

Комментарии:

1. Вау, как быстро! И действительно, именно проблема и решение. Спасибо, Ричард! Мои скромные похвалы от complete the other side of the world 🙂

2. Большое вам спасибо, я был в одной лодке, и это самое прямое решение этой проблемы, которое я нашел до сих пор