【问题标题】:multiple variable, table and parameters into one query多个变量、表和参数在一个查询中
【发布时间】:2018-01-26 17:26:19
【问题描述】:

我有三张桌子:

教练

  • c_id
  • cName

设备

  • e_id
  • 易名
  • c_id
  • 用语

运动

  • c_id
  • 运动

这是一个指向 SQL FIDDLE 页面的链接,以便您可以查看准备好的表以更好地理解我的意思。 SQL Fiddle prepared tables

每个字段的简要说明 c_id = 教练 ID,cName = 教练姓名,e_id = 设备 ID,eName = 设备名称,termUsed = 设备迄今为止使用的术语数,sports = 他们教授的运动(有些教授多个)

运动表已标准化,他们教授的每项运动都有一个字段。有些教练只教授一项运动,有些教练教授多项运动。根据我在 StakOverFlow 上看到的其他帖子,我被建议对数据进行规范化。

主键教练(c_id),设备(e_id)
外键
装备(c_id) 参考 教练(c_id)
运动(c_id)参考教练(c_id)

我需要什么
(结果集在列中)
[教练 A_id][教练 A_name][装备 A_id][装备 A_Name][Common Sport][教练 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;

到目前为止,这就是我能够弄清楚的全部;一个查询,它允许我匹配并显示两位教练的结果,他们分享他们教授的一项或多项常见运动。这只解决了问题的一部分,因为它使教练与他们教授的共同运动相匹配,但它也不匹配基于他们使用的术语数量的设备(由个别教练拥有)。

目标
这个项目的重点是在社区中心匹配教练(他们自己购买设备),根据一项共同的运动来交易(同样磨损的)设备。请记住,这是在一个低收入社区,所以我们没有太多的预算可以使用。所以我正在创建这个数据库作为降低成本和更加机智的解决方案。也为了帮助教练获得同样破旧的设备......这样没有人会得到比他们交易的设备更旧的设备。我们很穷..所以我们尽量足智多谋。排球也可以用作足球来教孩子们。这不是一个专业的团队,它是一个针对低收入地区儿童的社区中心外展计划。

我曾因发布低质量帖子而被警告过。我已阅读必要的文件,并尽我所能在发帖时遵守所有规则和准则。在发布这篇文章之前,我也搜索了一周以找到答案。

【问题讨论】:

  • sportsTaught 表是什么?它没有显示在顶部。应该是sport
  • 所以教练只能共享他们的设备,如果使用频率相同?
  • @Barmar 是的,对此感到抱歉...sportTaught 应该是运动
  • @M.Wagner 是的,他们只允许在设备平等使用的情况下共享设备....所以相同数量的条款

标签: mysql sql database


【解决方案1】:

改掉使用叉积的习惯,尤其不要将叉积与显式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

DEMO

【讨论】:

  • 哇,谢谢,我已经尝试了一个半星期了。我一直在尝试为教练表创建两个变量,然后尝试将它们与 sportsTaught 表连接起来。我知道我哪里出错了。所以我明白你回答中的一切......我只是不明白一行:“JOIN sportTaught sb ON sa.sports = sb.sports AND sa.c_id
  • 那是为了避免两次加入同一对教练的相反方向。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 2015-09-01
相关资源
最近更新 更多