Как объединить строки из таблицы базы данных MySQL - PullRequest
2 голосов
/ 28 декабря 2011

РЕДАКТИРОВАТЬ: я переформулировал вопрос, потому что он казался слишком сложным в другом смысле.

Рассмотрим следующие таблицы базы данных

пользователей

#id #money
1   100
2   150
3   100
4   200
5   200
6   100
7   250
8   300
9   150
10  100

объединено

#mainID #mergeID
1       2
1       3

Как мне сформулировать оператор Select, который суммирует деньги слитых идентификаторов и составляет список топ-10?Моя реальная база данных содержит около 100 000 строк идентификаторов / денег и около сотни слияний.Это означает, что важно помнить о производительности.

Вот что я хочу получить в качестве результата в этом самом примере:

#id #money
1   350    // sum of the rows with id 1,2,3 because they're merged!
8   300
7   250
4   200
5   200
9   150
6   100
10  100

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

После долгих проб и ошибок я нашел (грязный) способ сделать это напрямую.Вот оно:

SELECT 
  id, 
  SUM(money) AS sum_money
  IFNULL(mainID, id) AS uniqueID
FROM 
  users
LEFT OUTER JOIN
  merged
ON
  id=mergeID
GROUP BY 
  uniqueID
ORDER BY 
  sum_money
LIMIT 
  10
0 голосов
/ 28 декабря 2011

Добавьте столбец foreign key, ссылающийся на user.pk в вашей таблице.

Редактировать: Я думаю, что вы проголосовали, потому что я не дал понять, что.

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

select * from user ;
id | money | ref_user
1    100       1
2    150       1
3    100       1
4    200       23
5    200       11
6    100       11

Вы сможете написать совокупный запрос, подобный следующему:

select sum(money) as sum_money from user group by ref_user 
    order by sum_money
    limit 10;

Чтобы получить то, что вам нужно.

...