我想在下表中显示有关会议中最近2个注册的一些信息。例如,此表显示,最后一次注册是由John完成的,并且是2位参与者的注册,注册总价值为10.00。
User that did the registration | Quantity of participants registered | Total Value
John 2 10.00$
Jake 1 5.00$
您知道如何通过sql查询正确实现吗?我正在这样测试,但无法正常工作: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)
如果您不跟踪创建注册的时间/日期,则将无法检索到它。
我建议按照以下方式做些事情:
CREATE TABLE registration_types
(id int, name varchar(3),price double, conference_id int, date_created datetime);
,
,然后在创建注册时,应存储当前时间。然后,您应该能够在查询数据库时按该字段排序。另外,我建议在加入表时加入ID。当前,您正在执行交叉联接,这是表的笛卡尔积
users,
participants,
registration_types
。
这将创建无意义的数据,并占用不必要的空间。
答案 1 :(得分: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 |
注意:
join
,所以请使用JOIN
而不是逗号,条件为,
的{{1}}是where
的旧样式。