每个id的SQL select记录,其中max year等于value

时间:2014-08-12 02:49:05

标签: sql max inner-join

这方面有很多信息,但似乎没有任何内容与我的问题完全匹配,而且我被卡住了。

我有两张桌子,'成员'和'payment_records'。 'members'表包含唯一的member_id以及其他数据(地址,payment_type等)。 'payment_records'表包括唯一的payment_id,以及相对于谁付款的member_id,以及expiry_year(例如2011年,2012年,2013年等)。每个member_id都有多个付款记录。

我需要获取每个member_id的MAXIMUM expiry_year与动态值($ year)匹配的记录。现在我正在返回所有成员都有expiry_year = $ year的记录,即使它不是MAXIMUM值。例如,Mary可能会在2013年和2014年到期年份有2笔付款,因此她在我的结果中显示$ year = 2013,即使她最近的结果是2014年。我如何限制它以便仅在最大值时返回记录expiry_year是= $ year?

现在这是我的(简化)声明,它会返回正确到期的记录,但不会淘汰新年的记录:

SELECT members.member_id, payment_records.expiry_year, payment_records.member_id
        FROM members inner join payment_records on members.member_id=payment_records.member_id
        WHERE member_category='Standard' AND payment_records.expiry_year = $year"

我尝试过使用子语句,但是对于我的内连接语句中的正确语法感到困惑。我也尝试过使用带有ORDER BY的DISTINCT和GROUP BY,但它只给我空白的结果。

提前感谢任何帮助。我很抱歉,如果这是一个双倍的,我一直在寻找教程,直到我的眼球疼痛没有运气。

1 个答案:

答案 0 :(得分:4)

您希望将group byhaving用于此逻辑:

SELECT members.member_id, MAX(pr.expiry_year)
FROM members m inner join
     payment_records pr
     on m.member_id = pr.member_id
WHERE m.member_category = 'Standard'
GROUP BY m.member_id
HAVING MAX(pr.expiry_year) = $year;