SQL-从1个表中计算年龄计数,并根据另一个表的日期范围将其放在一列中

时间:2016-06-09 12:49:26

标签: sql mysqli

有1张桌子T1。如下图所示

enter image description here

第二桌T2

enter image description here

现在我必须使用T1作为源表,并根据T2的年龄将计数列入'no of member'

3 个答案:

答案 0 :(得分:1)

您的sql代码,T2.age的值必须拆分,我选择SQL substring 这是你的SQL,我没有测试它,但它应该工作,如果我发现我将编辑的错误:

Update T2 set no_of_member = 
    (Select COUNT(*) FROM T1 
        WHERE T1.age 
        BETWEEN substring(T2.age,1,instr(T2.age,"-") -1) AND           ´
                substring(T2.age,instr(T2.age,"-"),LEN(T2.age))
    );

说明:

substring(T2.age,1,instr(T2.age,"-") -1)

通过使用字符串的初始位置和"-"字符的位置来获取T2.age中第一个年龄的值

T2.age = '23-25' ---> substring(T2.age,1,instr(T2.age,"-") -1) = 23

同样的道理 substring(T2.age,instr(T2.age,"-"),LEN(T2.age) = 25

其余的是简单的更新查询

<强>建议: 不要像那样("23-25")保存T2.age。而是将它分开,以便您可以通过使用一列T2.from和另一个T2.until或类似的内容来运行更简单,更快速的查询

答案 1 :(得分:0)

执行此操作的一种简单方法是相关子查询。但是,t2的结构很糟糕。您应该具有最小值和最大值的列。因为您没有这个,所以您的查询比实际需要的更复杂:

update t2
    set numOfMembers = (select count(*)
                        from t1
                        where t1.age >= substring_index(t2.age, '-', 1) + 0 and
                              t2.age <= substring_index(t2.age, '-', -1) + 0
                       );

不要在一列中放置两个值(例如您的范围)。相反,有两列minagemaxage

答案 2 :(得分:0)

select count(*) from t1, t2 where t1.Age between LEFT(t2.age , 2) and Right(t2.age , 2) group by t2.age

这将使你不再需要会员