gpt4 book ai didi

mysql - 查询为每个 2-uple 字段列出一行

转载 作者:行者123 更新时间:2023-11-29 23:33:15 25 4
gpt4 key购买 nike

我有 3 张 table 。表1 用户,表 2 研究要求,表3研究

researchReq 表有一些要求,我用它们来检查用户是否适合该特定研究(例如 min_agemax_age 等) )和一个 int 字段(num_of_days)。 research 表有一个代表researchReq 的FK、一个代表user 的FK、一个日期字段和一些更多信息。在适合任何 researchReq 的用户中,我需要所有最后一次 research 注册时间超过 researchReq.num_of_days 的用户以及所有那些没有任何研究注册。

例如

User
# | age
1 | 20
2 | 19
3 | 21

researchReq
# | min_age | max_age | num_of_days
1 | 15 | 25 | 20
2 | 25 | NULL | 30

research
# | req_id | user_id | date
1 | 1 | 3 | 2014-08-20
2 | 1 | 3 | 2014-09-20
3 | 1 | 3 | 2014-10-20
4 | 1 | 2 | 2014-08-20
5 | 1 | 2 | 2014-09-20

在本例中,所有 3 位用户均符合 researchReq #1

*min_age 和 max_age 可为空。如果它们为空,我在检查用户是否适合时需要考虑

user_id | researchReq_id | last
1 | 1 | null
2 | 1 | 30

用户 #1 没有任何寄存器,因此“last”为空。

用户 #2 最后一次注册是在 20 多天后,所以我列出了他和他的间隔。

由于用户 #3 的最后一次注册研究还没有超过 20 天,所以我不需要他。

我尝试过这样的事情:

select ur.user_id, ur.req_id ,datediff(curdate(),ri.date) as last
from
(
select u.id as user_id, r.id as req_id, r.num_of_days as n_days
from user u
join researchReq r
on (r.min_age is null or datediff(curdate(),u.age) >= r.min_age)
and (r.max_age is null or datediff(curdate(),u.age) <= r.max_age)
) as ur
left join research ri
on ur.user_id = ri.user_id and ur.req_id = ri.req_id
having last > ur.n_days

但是我遇到了一个问题。此查询列出了每个用户的所有research ri 注册信息,我只需要每个ri.user_idri.req_id 的注册信息以及最后日期(就像复合PK)。我不能只使用group by user_id,因为它可能有两个或多个不同的ri.req_id

我只是不知道该怎么做。感谢您的帮助,并对我的英语不好表示歉意。

@编辑

如果用户使用 FK 研究了 2 个或更多 ResearchReq,则此查询将为我提供所有 ResearchReq 的 min(datediff())。我需要一一的,例如:

user_id | researchReq_id | last
1 | 1 | null
2 | 1 | 30
2 | 2 | 15

查询返回

user_id | researchReq_id | last
1 | 1 | null
2 | 1 | 15
2 | 2 | 15

最佳答案

我不能 100% 确定我理解您的要求,但这至少重现了您使用所提供的数据寻找的答案。

select u.user_id, r.id as researchReq_id, u.last from (
select u.id as user_id, u.age, min(datediff(now(), date)) as last
from user u
left join research r on r.user_id = u.id
group by u.id
having last is null or last > 20) as u
join researchReq r
on (r.min_age is null or u.age >= r.min_age)
and (r.max_age is null or u.age <= r.max_age)

Link to SQL Fiddle

关于mysql - 查询为每个 2-uple 字段列出一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26471578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com