我试图找出下面的代码是否采用正确的格式来检索年度付款总额
select sum(payment)
select mem_type.mtype, member.name, payment.payment_amt
from mem_type, member, payment
where mem_type.mtype = member.mtype
and member.mem_id = payment.mem_id
group by mem_id
having payment.date > '2014-1-1' <'2014-12-31';
答案 0 :(得分:0)
声明中存在一些问题。
关键字SELECT出现两次,并且它的有效方式无效。 (子查询或内联视图中需要SELECT关键字,否则,重复关键字SELECT无效。
HAVING子句中的谓词并不完全正确。 (MySQL可能会接受它作为有效的语法,但它没有做你想要做的事情。要返回特定年份中payment.date
的行,我们通常会将其指定为谓词在WHERE子句中:
WHERE payment.date >= '2014-01-01'
AND payment.date < '2015-01-01'
另外,我建议你放弃连接操作的旧式逗号语法,改为使用JOIN关键字,并将连接谓词从WHERE子句重定位到ON
子句。例如:
SELECT ...
FROM member
JOIN mem_type
ON mem_type.mtype = member.mtype
JOIN payment
ON payment.mem_id = member.mem_id
很高兴看到您已经对所有列引用进行了限定。
不幸的是,它无法推荐将返回您正在寻找的结果集的语法。有太多未知数,我们只是在猜测。您需要返回的结果的示例,从哪些数据返回规范。
如果我不得不盲目&#34;猜测&#34;在一个满足模糊规范的查询中,不知道表,列,数据类型等。我的猜测是这样的:
SELECT m.mem_id
, t.mtype
, m.name
, IFNULL(SUM(p.payment_amt),0) AS total_payments_2014
FROM member m
LEFT
JOIN mem_type t
ON t.mtype = m.mtype
LEFT
JOIN payment p
ON p.mem_id = m.mem_id
WHERE p.date >= '2014-01-01'
AND p.date < '2014-01-01' + INTERVAL 1 YEAR
GROUP BY m.mem_id
这只是一个例子。这是以未提供的大量信息为前提的(例如,付款表中date
列的数据类型是什么?我们是否要排除日期为1/1或12的付款/ 31?成员表中mem_id
列是唯一的吗?mtype
表中的mem_type
列是唯一的,成员表中的mem_type
列是否为NULL,我们是否希望所有返回的成员表中的行,或者只有那些在2014年付款的行等。支付表上的mem_id
列是否可以为NULL,payment
中是否包含我们想要包含的行但是#39; t与会员有关?等人