получить последние регистрации в конференции

0

Я хочу показать некоторую информацию о последних двух регистрациях в конференции в таблице, как показано ниже. В этих таблицах, например, показано, что последняя регистрация была сделана Джоном и является регистрацией с 2 участниками, а общая стоимость регистрации - 10.00.

User that did the registration | Quantity of participants registered | Total Value
            John                               2                        10.00$
            Jake                               1                        5.00$           

Вы знаете, как правильно достичь этого с помощью SQL-запроса? Im тестирует это, но не работает: http://www.sqlfiddle.com/#!9/225d82.

select users.name, 
  count(participants.registration_id), 
   sum(registration_types.price) 
from 
  users,
  participants, 
  registration_types
Group by(users.name)

Запрос возвращается:

name    count(participants.registration_id)     sum(registration_types.price
Jake              8                                          80
John              8                                      80

Но он должен вернуться:

name    count(participants.registration_id)     sum(registration_types.price
Jake              3                                     30
John              1                                     10

Структура таблиц, имеющих отношение к вопросу:

У меня есть таблица участников, в которой хранятся все участники конференции:

id     registration_id      registration_type_id      name        
1        1                        1                   Jake 
2        1                        1                   Jane
3        1                        2                   Paul
4        2                        2                    Ben  

В таблице регистрации хранятся все записи:

id       status     conference_id     user_that_did_registration
1         incomplete     1                        1   (User with id 1 did the registration in the conference with id 1)
2         incomplete     1                        2

В таблице типов регистрации хранятся типы регистрации:

id     name       price         conference_id
1      rtype1      5.00              1
2     rype2        10.00             1

Таблица пользователей

id      name       
1       John
2       Jake
  • 0
    Давайте сосредоточимся на вашем вопросе - получите две последние регистрации на конференцию. Я не вижу в вашем запросе ничего, что ограничивало бы две последние записи. Как ваш дизайн поддерживает фильтрацию этой информации? Как указано в ответе ниже, вам необходимо хранить некоторую информацию о дате и времени регистрации - например, дату и время, когда она была взята, чтобы вы могли отфильтровать ее.
  • 0
    Как только вы это сделаете, вам нужно обратиться к декартову произведению в вашем запросе. Исправьте это, и все ваши суммы будут работать нормально.
Показать ещё 1 комментарий
Теги:

2 ответа

0
Лучший ответ

Из вашего ожидаемого результата вам, похоже, нужно это сделать.

SELECT u.name,COUNT(pp.registration_id),SUM(rt.price) 
FROM registration_types rt 
INNER JOIN participants pp on pp.registration_id = rt.id
INNER JOIN users u on u.id = pp.registration_id
group by u.name

sqlfiddle: http://www.sqlfiddle.com/#!9/d28adf/8

[Результаты]:

| name | COUNT(pp.registration_id) | SUM(rt.price) |
|------|---------------------------|---------------|
| Jake |                         3 |            30 |
| John |                         1 |            10 |

Замечания:

  • ANSI 92 стандарт join, поэтому использовать JOIN вместо запятой, , с where условие старый стиль join.
  • 0
    Спасибо, не могли бы вы объяснить эту часть "ВНУТРЕННИЕ ПРИСОЕДИНЯЙТЕСЬ к пользователям u.id = pp.registration_id"? Потому что registration_id в таблице участников не user_id.
  • 0
    Поскольку я предполагаю, что registration_id означает зарегистрированный идентификатор пользователя
Показать ещё 2 комментария
0

Если вы не отслеживаете время/дату создания регистрации, вы не сможете ее восстановить.

Я бы предложил сделать что-то в этом направлении:

CREATE TABLE registration_types (id int, name varchar(3),price double, conference_id int, date_created datetime); ,

а затем, когда вы создаете регистрацию, вы должны сохранить текущее время. Затем вы можете заказать это поле при запросе базы данных. Кроме того, я бы рекомендовал присоединиться к ID при подключении к таблицам. В настоящее время вы выполняете кросс-соединение, которое является декартовым произведением таблиц

users, participants, registration_types.

Это создает бессмысленные данные и занимает больше места, чем это необходимо.

  • 0
    Спасибо, но с этим запрос не показывает также правильные данные.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню