2015-06-15 3 views
3

Как использовать значение из столбца другого, чтобы я мог создать другой столбец с суммой того же типа.MySQL: используйте значение столбца в той же строке для подсчета

например.

+---------+------+ 
| name | team | 
+---------+------+ 
| Michael | red | 
| Lebron | blue | 
| Ben  | red | 
| Tiger | red | 
| John | blue | 
+---------+------+ 

Выход:

+---------+------+----------------+ 
| name | team | member_counter | 
+---------+------+----------------+ 
| Michael | red |    3 | 
| Lebron | blue |    2 | 
| Ben  | red |    3 | 
| Tiger | red |    3 | 
| John | blue |    2 | 
+---------+------+----------------+ 

Как вы можете видеть, 3 красных и 2 блюз. Так или иначе, я могу использовать значение предыдущих столбцов? count (команда = предыдущий столбец)? как member_counter?

ответ

1

Вы должны сделать join с суб выбора всех команд

select name, team, teams.count 
from names 
join (select team, count(1) as count from names group by team) as teams 
using (team); 

sqlfiddle

+0

вот что я ищу! Благодарю. :) – Angelo

-1

Просто сделайте подзапрос:

select *, (select count(*) from table t2 where t1.team = t2.team) as member_counter 
from table t1 

EDIT:

Я проверил на 1 миллион строк. Планы выполнения этого запроса и запроса из принятого ответа на 99% идентичны. Со статистикой времени оба запроса выполняют абсолютно то же самое. С помощью статистики IO оба запроса выполняются абсолютно одинаково. И теперь я просто не могу понять, почему я получил вниз. Единственное отличие - моя версия короче и понятнее.

EDIT2:

Это работает скрипку:

select *, (select count(*) from tmp t2 where t1.team = t2.team) as member_counter 
from tmp t1 
+0

Помимо синтаксически неправильной работы, это имеет ужасную производительность, так как это запустит ЗАВИСИМОЕ СУБКЕРУ, один раз для каждой строки в таблице. –

+0

@AndreasWederbrand, ты так уверен? Может быть пересмотрено какое-то руководство? http://sqlfiddle.com/#!9/97d81/1 И, во-вторых, двигатель не настолько глуп, чтобы оценить тот же подзапрос для каждой строки во внешнем запросе ... –

+0

Я уверен. Поскольку вы знаете, что ваш ответ не такой же, как у вашей скрипки, так что вы также заметили ошибки ... движок будет оценивать дополнительный запрос один раз для каждой команды, которая в этом простом случае «просто» дважды. С 10 цветами он будет оцениваться 10 раз. –

1

Вы Калифорния п JOIN к производной таблице, содержащей team отсчетов:

SELECT m.name, m.team, t.cnt AS member_counter 
FROM mytable AS m 
INNER JOIN (
    SELECT team, COUNT(*) AS cnt 
    FROM mytable 
    GROUP BY team) t 
ON m.team = t.team 

Это, вероятно, лучше, чем коррелированный суб-запрос.

Demo here

1
  1. Если вы просто хотите, результат, как это, вы можете сделать:

    SELECT T1.name,T1.team,T2.member_count 
    FROM TableName T1 JOIN 
        (SELECT name,team,count(team) as member_count 
        FROM TableName 
        GROUP BY team) T2 ON T1.team=T2.team 
    

    Результат:

    name team member_count 
    ---------------------------- 
    Michael red  3 
    Lebron blue 2 
    Ben  red  3 
    Tiger red  3 
    John blue 2 
    

    Пример в SQL Fiddle.

  2. Если вы пытаетесь добавить еще один столбец member_counter таблицу, вы можете сделать это:

    ALTER TABLE TableName 
    ADD member_counter INT NULL 
    
    
    UPDATE TableName a 
        JOIN 
        (SELECT name,team,COUNT(team) as member_counter 
        FROM TableName b 
        GROUP BY team) b ON a.name = b.name AND a.team=b.team 
    SET a.member_counter = b.member_counter 
    

    Пример в SQL Fiddle.

+0

Я просто хочу использовать команду SELECT, спасибо! – Angelo

+0

@ Ангело: Посмотрите первую часть в моем ответе. –

Смежные вопросы