MySQL объединяет результаты из UNION таблиц с одинаковой схемой - PullRequest
2 голосов
/ 05 января 2012

Существуют две таблицы с одинаковой структурой: «imsc_storage_users» и «imsc_storage_users_archive».

Мой текущий SELECT / UNION:

SELECT `cli`,`ts`,`questions`, `answers`,`correct`,`last`,`minutes` 
FROM  `imsc_storage_users`
UNION DISTINCT
SELECT `cli`,`ts`,`questions`, `answers`,`correct`,`last`,`minutes` 
FROM  `imsc_storage_users_archive`
ORDER BY `correct` DESC,`minutes` ASC

Я получаю эти результаты:

+--------------+---------------------+-----------+---------+---------+------+---------+
| cli          | ts                  | questions | answers | correct | last | minutes |
+--------------+---------------------+-----------+---------+---------+------+---------+
| 111111111111 | 2011-12-22 11:13:57 |        30 |      29 |      14 |   30 | 1305.47 |
| 222222222222 | 2011-12-15 13:39:16 |        26 |      24 |      13 |   24 |   15.67 |
| 333333333333 | 2011-12-15 13:39:39 |        26 |      25 |      11 |   25 |   15.18 |
| 444444444444 | 2011-12-15 13:39:39 |        25 |      21 |      11 |   25 |  280.53 |
| 111111111111 | 2011-12-22 11:13:57 |        25 |      21 |      10 |   25 |  373.87 |
| 555555555555 | 2011-12-19 15:46:15 |        11 |      10 |       5 |   10 |     3.8 |
| 666666666666 | 2011-12-15 13:39:16 |        14 |      10 |       4 |   10 |  321.64 |
| 777777777777 | 2011-12-19 08:34:36 |        15 |      11 |       4 |   13 |  474.66 |

Обратите внимание, что «111111111111» появляется дважды?

Я хочу, чтобы это было объединено, поэтому в наборе результатов я получаю одну строку '111111111111', которая объединяет / суммирует все поля; 'questions' = >> 55 .... и т. д. .

Каким будет правильный SQL?
Производительность не является проблемой здесь.

Спасибо!

Ответы [ 2 ]

8 голосов
/ 05 января 2012
SELECT `cli`,max(`ts`) AS ts, sum(`questions`) as questions, sum(`answers`) as answers,sum(`correct`) as correct,sum(`last`) as last,sum(`minutes`) as minutes
FROM (
  SELECT `cli`,`ts`,`questions`, `answers`,`correct`,`last`,`minutes` 
  FROM  `imsc_storage_users`
  UNION ALL
  SELECT `cli`,`ts`,`questions`, `answers`,`correct`,`last`,`minutes` 
  FROM  `imsc_storage_users_archive`
) AS baseview
GROUP BY cli
ORDER BY `correct` DESC,`minutes` ASC
3 голосов
/ 05 января 2012

Попробуйте:

SELECT `cli`,
       `ts`,
       sum(`questions`), 
       sum(`answers`),
       sum(`correct`),
       sum(`last`),
       sum(`minutes`)
FROM (SELECT `cli`,`ts`,`questions`, `answers`,`correct`,`last`,`minutes` 
      FROM  `imsc_storage_users`
      UNION ALL
      SELECT `cli`,`ts`,`questions`, `answers`,`correct`,`last`,`minutes` 
      FROM  `imsc_storage_users_archive`) V
group by `cli`, `ts`
ORDER BY 5 DESC, 7 ASC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...