【问题标题】:mysql outer join (unselected) on assosiative table关联表上的mysql外部连接(选择)
【发布时间】:2016-04-13 21:00:25
【问题描述】:

我有 3 个表 = 'Test','Test_quo','Subject'

表格测试

idtest | Test
1      | Test wave 1
2      | Test Wave 2

Table Test_quo

idtest | idsubject
1      | 1
1      | 2
1      | 3
2      | 1

表格主题

  idsubject| subject
    1      | Math
    2      | Bio
    3      | Sport
    4      | Literature

我需要的是选择外部(在某些测试中未选择的主题), 例如,在 idtest=1 上,结果将是文献

 idsubject | subject
    4      | Literature

不知何故,我已经尝试过使用left,outer并没有达到预期的结果(选择/选择)主题。

SELECT subject.idsubject, subject FROM subject right OUTER JOIN test_quo ON (subject.idsubject = test_quo.idsubject) where test_quo.idtest=1'

我的查询将得到结果

idsubject | subject
       1  | Math
       2  | Bio
       3  | Sport

【问题讨论】:

  • 您的问题不清楚您想要做什么的逻辑。为什么要idsubejct = 4
  • 我想选择在某些测试中从未参加过的主题的哪个选项。例如测试已经有数学、生物、运动。给出的选项只有文学(也防止主键检查),因为当两个 pk 相遇时会出错,不是吗?由于关联表。

标签: mysql left-join where outer-join


【解决方案1】:

我相信你需要像下面这样的东西。它将为您提供所有测试的“未选择”主题。

SELECT subject.idsubject, subject 
FROM subject 
LEFT OUTER JOIN test_quo ON (subject.idsubject = test_quo.idsubject) 
WHERE ISNULL(test_quo.idsubject) 

DEMO

仅针对idtest=1 我想出了以下相关子查询:

SELECT s.idsubject, subject 
FROM subject s
WHERE NOT EXISTS (SELECT 1 
                  FROM test_quo t 
                  WHERE s.idsubject = t.idsubject AND t.idtest = 1)

Another Demo

并且(最终)与 OUTER JOIN 相同:

SELECT subject.idsubject, subject 
FROM subject 
LEFT OUTER JOIN test_quo ON (subject.idsubject = test_quo.idsubject AND test_quo.idtest = 1)
WHERE ISNULL(test_quo.idsubject) 

Demo with one more subject

【讨论】:

  • 已修复。请重试。
  • 当我更改表test_quo上的几个值时出现问题,结果总是4 |文学
  • 请张贴(添加到您的问题中)您破坏我的代码的数据。
  • 您的代码,因为我的假设只会读取(某些主题从未被所有测试采用)。我想要的是从未通过某些测试的阅读科目。
  • 查看我的第二个解决方案。
猜你喜欢
  • 2017-12-30
  • 2013-01-20
  • 1970-01-01
  • 2013-01-22
  • 2011-12-13
  • 2015-11-01
  • 2013-12-17
  • 2013-11-18
  • 2016-11-12
相关资源
最近更新 更多