2013-04-19 3 views
0

У меня есть представление с большим количеством данных. Я получил эти результаты, используя подзапросы (данные, которые хорошо и оптимизировано):Неверный результат с использованием суммы в MySQL

+------------+ 
| attendance | 
+------------+ 
|  319 | 
|  102 | 
|  598 | 
|  113 | 
|   6 | 
|  279 | 
|  366 | 
|  146 | 
|  669 | 
|  205 | 
|  123 | 
+------------+ 

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

+------------+ 
| attendance | 
+------------+ 
|  319 | 
|  102 | 
|  598 | 
|  113 | 
|   7 | 
|  279 | 
|  253 | 
|  146 | 
|  669 | 
|  561 | 
|  123 | 
+------------+ 

Что хорошо, потому пользователю что обновление информации было тем, что до этого было 6 в качестве посещаемости.

Но проблема возникает, когда я использую, что данные о качестве TempTable, а затем я делаю:

SELECT SUM(attendance) AS total FROM (/* Subquery returning the above table */) 

причина возвращается (в первую очередь с один пользователь, имеющий 6, как посещаемость):

+-------+ 
| total | 
+-------+ 
| 3169 | 
+-------+ 

И с 7:

+-------+ 
| total | 
+-------+ 
| 3128 | 
+-------+ 

Когда это должно быть 3170 !!!

Идеи?

EDIT 1: Вставьте полный запрос.

SELECT SUM(att_member) AS total 
FROM 
    (SELECT attendance AS att_member 
    FROM 
     (SELECT id_branch_channel, id_member, attendance, TIMESTAMP, id_event 
      FROM view_event_attendance 
      WHERE id_event = 782 
      ORDER BY TIMESTAMP DESC) AS temptable 
    GROUP BY 
       id_member) AS total_attendance_temp 

EDIT 2: Оклейка помощь запрос я получил здесь

Select only last value using group by at mysql

Вот схема представления.

+1

Либо это ошибка MySQL, либо проблема с подзапросом. Я делаю ставку на подзапрос :) Можете ли вы опубликовать его? –

+0

, если запросы необычайно огромны/уродливы, можете ли вы показать их здесь? –

+2

Также обратите внимание, что списки значений в вашем посте имеют отличия от 6 и 7 в строке 5. Ряд 7 также имеет 366 в первом списке и 253 во втором, а строка 10 имеет 205 в первом списке и 561 в второй. –

ответ

0

Как заметил @EdGibbs, подзапрос возвращал плохие результаты (что-то я не заметил). Поэтому я еще раз перечитал свой код и the answer to the other question I make reference и вещи теперь работают, как они должны, как это сделать:

SELECT SUM(att_member) AS total 
FROM 
    (SELECT attendance AS att_member 
    FROM 
     (SELECT 
      id_branch_channel, 
      id_member, 
      substring(max(concat(from_unixtime(timestamp),attendance)) from 20) as attendance, 
      timestamp, 
      id_event 
      FROM view_event_attendance 
      WHERE id_event = 782 
      GROUP BY id_event, id_member 
      ORDER BY timestamp DESC) AS temptable 
    ) AS total_attendance_temp 

Единственное изменение, которое я сделал:

  • Использование: подстрока (макс (CONCAT (FROM_UNIXTIME (временная метка), посещаемость)) с 20) в качестве посещаемости, а не только для участия.
  • перемещение группы внутри первого подзапроса.

Так что проблема не в функции SUM в MySQL, а в моем запросе.

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

+0

Теперь я понимаю, что вы * на самом деле полагаетесь * на нестандартное поведение. Я могу понять, почему вы это делаете, но то, что может выглядеть как интеллектуальное решение, теперь может оказаться «наихудшей вещью когда-либо» (tm) в ретроспективе. – Hazzit

+0

Итак, что вы предлагаете? Позвольте мне объяснить, что я делаю. Мне нужно иметь журнал посещаемости событий. Поэтому по этой причине у меня есть таблица с только этой информацией: id_member_event (это fk для таблицы с информацией о соотношении event-member), посещаемость, метка времени. Таким образом, в этой таблице я могу не раз посещать событие (скажем, что пользователь посылает больше, чем в большом событии) – Cito

+0

В моем представлении_event_attendance у меня есть информация обо всем событии: id_event, id_member, _id_member_event, id_branch_channel , id_member_event_attendance, is_online, посещаемость, timestamp – Cito

1

Позволяет просмотреть запрос, не так ли?

Я предполагаю, что view_event_attendance имеет одну запись для каждого участника (участника), который присутствовал на мероприятии. id_event - это FK для этого события, id_member - FK для участника. Ваш внутренний выбор дает вам упорядоченный список всех участников, участвовавших в мероприятии # 782

SELECT id_branch_channel, id_member, attendance, TIMESTAMP, id_event 
FROM view_event_attendance 
WHERE id_event = 782 
ORDER BY TIMESTAMP DESC 

До сих пор такой хуевый. Теперь вы переносите этот запрос в другой:

SELECT attendance AS att_member 
FROM (subquery) 
GROUP BY id_member 

В большинстве наборов диалогов SQL это просто синтаксическая ошибка. MySQL позволяет это, но результат, вероятно, не тот, который вы искали. Вы получите посещаемость столбца для каждого id_member, который присутствовал на указанном мероприятии. То, что вы действительно можете ожидать, - это SUM посещаемости, но я не говорю об этом в вашем вопросе. В любом случае, каждое выбранное поле должно быть либо в вашем предложении GROUP BY или с помощью агрегатной функции, такие как

SELECT SUM(attendance) AS att_member 
FROM (subquery) 
GROUP BY id_member 

или

SELECT attendance AS att_member 
FROM (subquery) 
GROUP BY id_member, attendance 

Имея, что сказал, я не вижу в этом необходимости для начала использовать подзапрос.Давайте предположим, что вы хотели бы получить SUM, как указано выше, вы можете reprase это в одном запросе SQL:

SELECT SUM(attendance) AS att_member 
FROM view_event_attendance 
WHERE id_event = 782 
GROUP BY id_member 

Если вы тогда хотели всего, вы могли бы просто оставить вне пункт GROUP BY, оставив вас с этим:

SELECT SUM(attendance) AS att_member 
FROM view_event_attendance 
WHERE id_event = 782 

Если это не работает должным образом, пожалуйста, опишите более подробно то, что вы на самом деле храните в view_event_attendance, и то, что вы хотите получить во втором запросе.

+0

Спасибо за помощь! Но я думаю, что если вы [прочитаете другую ссылку, которую я вставил] (http://stackoverflow.com/questions/15421616/select-only-last-value-using-group-by-at-mysql), тогда вы поймете, почему я нужен подзапрос. Я нашел, однако свою ошибку. Повторяя эту ссылку, я помню, что я никогда не использовал ответ там, поэтому делать это так, как это исправлено. Есть ли комментарии? Посмотрите ответ, который я приведу здесь. И еще раз спасибо :) – Cito

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