我是Toastmasters俱乐部的成员,并且负责安排哪些成员在每周会议中担任哪些角色。我正在编写一个小应用程序来帮助管理这个问题,我认为数据库可以帮助我确定哪个成员最应该在每个角色中服务。
为了简化问题,假设我的数据库有两个表... MEMBER
和ROLE_PERFORMED
:
MEMBER
------
ID int
NAME varchar
ROLE_PERFORMED
--------------
MEMBER_ID int (half of primary key, and also foreign key)
DATE date (other half of primary key)
ROLE int (0-11, mapped to an enumeration at the application layer)
我的目标是为每个角色类型编写一个SQL查询,它将为我提供:
MEMBER.NAME
,适用于MEMBER
表中的所有行
第二列,包含与该成员和角色匹配的最新 ROLE_PERFORMED.DATE
值...或者NULL
(或其他一些占位符)该成员从未担任该角色
然后我可以按日期/占位符列进行排序,并按照谁没有执行该角色的时间最长的顺序分配角色。像这样:
ROLE NAME MOST_RECENTLY_PERFORMED
--------------------------------
1 John <null>
1 Joe 2010-02-25
1 Bob 2010-09-14
我目前采取的方法是在一个UNION
之间尝试一个SELECT
...来抓住那些已经执行过这个角色的成员,以及第二个从未执行过这个角色的SELECT抓取成员角色。像这样:
SELECT m.name, r.date FROM member m, role_performed r WHERE m.id = r.member_id and r.role = 1
UNION
SELECT m.name, (NULL?????) FROM member m, role_performed r WHERE (?????)
然而,这有三个问题,我希望有人可能有解决方案:
第一个SELECT
抓取所有成员执行该角色的日期,而不仅仅是最近的日期。
第二个SELECT
导致UNION
失败,因为我无法找到可用于第二个日期列的可接受的占位符值... UNION
' s要求每个查询返回相同数量的列。
第二个WHERE
子句超出了我有限的SQL技能。如何找到所有MEMBER
行,其中不的行与该成员和该角色匹配ROLE_PERFORMED
行?请记住,可以仍然是ROLE_PERFORMED
行与该成员匹配,而某些其他角色。
就像我说的那样,我不是世界上最伟大的SQL大师...所以如果我让它变得比它需要的更复杂,我会欢迎完全不同的方法。哎呀,我会欢迎一个更好的问题标题,以帮助有意义地呈现我所要求的!非常感谢。
答案 0 :(得分:0)
这样的事情?
SELECT member.name , role_performed.date FROM member
LEFT JOIN role_performed on role_perfomed.member_id = member.id
ORDER BY role_performed.date
答案 1 :(得分:0)
基本上你必须像这样使用CROSS JOIN:
选择 R.RoleId, 马克斯(R.Date) M.Name 从 会员M. 内部联接 ( 选择 R1.RoleId, R1.MemberId, R.Date 从 Role_Performed R. 正确加入 ( 选择 R2.RoleId, R1.MemberId, R2.Date 从 Role_Performed R1 CROSS JOIN Role_Performed R2 )R1 ON R1.Date = R.Date AND R1.MemberId = R.MemberId ) R ON M.MemberId = R.MemberId GROUP BY R.RoleId,M.Name 订购 R.RoleId GO
答案 2 :(得分:0)
SELECT m.Name, oj.RoleID, MAX(r.Date)
FROM member m JOIN
(
SELECT m.MemberID, ar.RoleID
FROM member m, (SELECT DISTINCT RoleID FROM role_performed) ar
) oj ON m.MemberID = oj.MemberID
LEFT JOIN role_performed r ON r.MemberID = oj.MemberID AND r.RoleID = oj.RoleID
GROUP BY m.MemberID, r.RoleID
答案 3 :(得分:0)
其中一些查询非常接近我需要的所有内容,我非常感谢所有回复的人。然而,最终我最终在应用程序层中完成了我需要的一些逻辑。其中一个SQL查询可能会在更完整的数据库平台上完成工作,但是嵌入式Derby数据库可能不支持足够的标准。
答案 4 :(得分:-2)
我会这样做希望这有助于
SELECT member.name,
马克斯(role_performed.date)
FROM成员
LE_ JOIN role_performed on role_perfomed.member_id = member.id
GROUP BY ROLE,member.name
ORDER BY ROLE,member.name