#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. Большое вам спасибо, я был в одной лодке, и это самое прямое решение этой проблемы, которое я нашел до сих пор