2015-05-28 3 views
1

У меня есть таблица t1 так:таблица обновлений на основе агрегирования из другой таблицы

Names Drug 

Tom  A 
Tom  A 
Tom  B 
Lily  B 
Lily  B 

и стол t2 так:

Names Drug COUNT(Drug) 

Tom  A 
Tom  B 
Tom  C 
Lily  A 
Lily  B 

Я хочу, чтобы вставить в COUNT(drug) колонку t2 данные от t1 после группировки по лекарству и имени. Нужный выход t2 выглядит следующим образом:

Names Drug COUNT(Drug) 

Tom  A  2 
Tom  B  1 
Tom  C  0 
Lily  A  0 
Lily  B  2 

Я думаю о создании еще одной таблицы t3 с GROUP BY drug, name данными t1, а затем UPDATE t2 на основе t3, но это довольно много времени.

ответ

2

В любое время, когда у вас есть сложная проблема, вы должны всегда пытаться разбить ее на мелкие кусочки, которые вы можете решить, и вернуть их вместе.

К примеру, я бы начать получать отсчеты имя/лекарственный препарат из первой таблицы, как это:

SELECT name, drug, COUNT(*) AS numDrugs 
FROM t1 
GROUP BY name, drug; 

Затем вы можете использовать это в качестве подзапроса при обновлении t2 путем объединения двух таблиц на условие, что имя и наркотик совпадают. Вы должны использовать LeftJoin и сливаться функцией, чтобы заменить значения, которые не существуют с 0:

UPDATE t2 
LEFT JOIN(
    SELECT name, drug, COUNT(*) AS numDrugs 
    FROM t1 
    GROUP BY name, drug) t1 ON t1.name = t2.name AND t1.drug = t2.drug 
SET drugCount = COALESCE(numDrugs, 0); 

Вот SQL Fiddle примера.

2

Я думаю, что этот вопрос может помочь вам: specific mysql update based on group by data

Вы можете сделать что-то вроде этого:

UPDATE t2 
LEFT JOIN 
(
    SELECT name, drug, count(*) num 
    FROM t1 
    GROUP BY name, drug 
) r ON t2.name = r.name AND t2.drug = r.drug 
SET t2.count_drag = COALESCE(r.num, 0); 
+1

Заметьте, что это возможно имя, пара наркотиков существует в t1, но не t2. Например, в образцовых данных OP вы никогда не будете обновлять строки для (Tom, C) и (Lily, A). Вы должны попробовать LEFT JOIN. – AdamMc331

+1

Да, вы правы. Я отредактирую свой ответ, спасибо! – flavi

+1

Выглядит хорошо! Единственное, что все еще отсутствует, это то, что левое соединение будет означать, что «r.num» имеет значение null для этих значений, а не 0. Рассмотрим добавление проверки с использованием 'IF()' или 'IFNULL()' или 'COALESCE()'. Любой будет работать, но я предпочитаю последний. – AdamMc331