我有三张桌子:
教练
设备
运动
这是SQL FIDDLE页面的链接,以便您可以看到准备好的表格以更好地理解我的意思。 SQL Fiddle prepared tables
每个字段的简要说明 c_id = coach id,cName =教练名称,e_id =设备ID,eName =设备名称,termUsed =到目前为止设备使用的术语数量,体育=他们教授哪种运动(一些教授多个)
运动表是标准化的,他们教授的每项运动都有单个领域。一些教练只教一项运动,一些教授多项运动。根据我在StakOverFlow上看到的其他帖子,我被建议将数据标准化。
主键 教练(c_id),设备(e_id)
外键
设备(c_id)参考教练(c_id)
体育(c_id)参考教练(c_id)
我需要什么
(结果列在列中)
[教练A_id] [教练A_name] [装备A_id] [装备A_Name] [公共运动] [教练B_id] [教练B_name] [装备B_id] [装备B_name]
我需要一个结果集,它返回两个教练ID和名称,他们教授的常见运动,以及根据他们的术语使用匹配的设备(属于每个教练)(设备使用的术语数量相同)对于)。
*过去一周,我能够弄明白的是:*
SELECT DISTINCT sa.c_id, sb.c_id, sb.sport, coach.name
FROM sportsTaught sa, sportsTaught sb
JOIN coach ON coach.c_id = sb.c_id
WHERE sa.sports = sb.sports
AND sa.c_id <> sb.c_id
ORDER BY sb.c_id;
到目前为止,这是我能够弄清楚的;一个查询,它允许我匹配并显示两个教练的结果,他们分享他们教授的一项或多项常见运动。这只能解决问题的一部分,因为它将教练与他们所教授的普通运动相匹配,但它也不会根据他们所使用的术语数量来匹配设备(由各个教练拥有)。 / p>
目标
这个项目的目的是在社区中心内匹配教练(他们购买自己的设备),根据一项普通运动交易设备(平均磨损)。请记住,这是在一个低收入社区,所以我们没有太多的预算可以使用。所以我创建这个数据库作为削减成本和更多资源的解决方案。此外,为了帮助教练获得同样磨损的设备...所以没有人比他们交易的设备更老。我们很穷。所以我们尽量保持足智多谋。排球也可以用作足球来教孩子们。这不是一个专业团队,是针对低收入地区儿童的社区中心外展计划。
我之前曾被警告过制作低质量的帖子。我已阅读必要的文件,并尽力遵守所有规则和指南,尽我所能发布。我也搜索了一个星期才发现这个帖子来寻找答案。
答案 0 :(得分:2)
摆脱使用交叉产品的习惯,特别是不要将交叉产品与明确的JOIN
混合使用。只需始终使用JOIN
。
要解决您的问题,您需要两次加入coach
表,然后两次加入equipment
表,每个教练一次。然后要求termUsed
相同,但名称不同。
SELECT ca.c_id coachA_id, ca.cName coachA_name, ea.e_id equipmentA_id, ea.eName equipmentA_name,
sa.sports,
cb.c_id coachB_id, cb.cName coachB_name, eb.e_id equipmentB_id, eb.eName equipmentB_name
FROM sportTaught sa
JOIN sportTaught sb ON sa.sports = sb.sports AND sa.c_id < sb.c_id
JOIN coach ca ON ca.c_id = sa.c_id
JOIN coach cb ON cb.c_id = sb.c_id
JOIN equipment ea ON ea.c_id = ca.c_id
JOIN equipment eb ON eb.c_id = cb.c_id AND ea.termUsed = eb.termUsed AND ea.eName != eb.eName
ORDER BY ca.c_id