2015-08-04 2 views
0

У меня возникли проблемы с созданием подсчета строк путем группировки на основе заданного значения поля. Например: У меня есть Таблица A структуру, как это:Значения столбцов счетчика Mysql и столбцы слияния

+------+------------+ 
| id | Person | 
+------+------------+ 
| 1 | "Sandy" | 
| 2 | "Piper" | 
| 3 | "Candy" | 
| 4 | "Pendy" | 
+------------+------+ 

Кроме того, у меня есть Таблица B структуру, как это:

+------+------------+---------+ 
| id | Person | Point | 
+------+------------+---------+ 
| 1 | "Sandy" | 10  | 
| 2 | "Piper" | 20  | 
| 3 | "Candy" | 30  | 
| 4 | "Sandy" | 10  | 
| 5 | "Piper" | 20  | 
| 6 | "Zafar" | 30  | 
+------------+------+---------+ 

И нужен результат, как:

+------+------------+---------+ 
| id | Person | Point | 
+------+------------+---------+ 
| 1 | "Piper" | 40  | 
| 2 | "Candy" | 30  | 
| 3 | "Zafar" | 30  | 
| 4 | "Sandy" | 20  | 
| 5 | "Pendy" | 0  | 
+------------+------+---------+ 

Надеюсь, что примеры таблиц сами по себе не требуют пояснений.

+0

Что такое поле идентификатор в таблице результатов? Является ли это идентификатором таблицы 1 или является ли это автоматически увеличиваемым значением? – Jens

+0

Фактически идентификатор не должен быть связан, слияние основано на имени человека. И итоговая таблица должна содержать человека из обеих таблиц. Я сделаю редактирование более подробным. – mane

+0

Я не понимаю столбец «id» в результирующем наборе. Что это? – Strawberry

ответ

0

Я думаю, что ниже sql полезно для вас.

select a.id, a.Person,b.total_point from (
select id, Person from tablea) as a join 

(select Person, sum(Point) as total_point from tableb group by person) as b on a.person =b.person 

Спасибо

+0

спасибо. Я проверяю. – mane

+0

Я пробовал ваш ответ, но я продолжаю получать ошибку, может быть, незакрытый ")" – mane

+0

какая ошибка вы получаете? –

2

Это простой left join с group by

select tableA.person, sum(tableB.points) from tableA left join tableB on tableA.person = tableB.person group by tableA.person 
union 
select tableB.person, sum(tableB.points) from tableB left join tableA on tableA.person = tableB.person where tableA.id is null group by tableA.person 
+0

На самом деле мне нужны поля из обеих таблиц, если вы видите, что «Pendy» и «Zafar» уникальны для таблиц A и B соответственно, не будут использовать левое соединение, вызывают там проблему? – mane

+0

@mane Я уже видел это. Это должен быть текст в вашем вопросе. См. Мой обновленный ответ. – Jens

+1

Я попробовал ваш ответ и, похоже, работает для конкретной проблемы. Но ответ, предоставленный Strawberry, кажется, тоже работает, и он чист и меньше sql. Но, сравнивая на основе производительности, которая была бы лучше? – mane

3
SELECT person 
    , SUM(point) total 
    FROM 
    (SELECT person,point FROM table_b 
     UNION 
      ALL 
     SELECT person,0 FROM table_a 
    ) x 
GROUP 
    BY person 
ORDER 
    BY total DESC; 
Смежные вопросы