我有一个表,其中包含保存材料的另一个主题类型。然后,我有另一个表,其中包含每个表的键,从而创建多对多的关系。
然而,当我尝试搜索主题以挑选出两个共享相同材料的主题时,它不起作用。
示例表:
材料表:
MatID | Name
---------------
1 | book1
2 | note23
主题表:
TID | topic
---------------
1 | computer
2 | database
MatTop表:
TID | MatID
------------
1 | 2
2 | 2
这是我的疑问:
SELECT * FROM material
INNER JOIN mattop ON material.MatID = mattop.MatID
INNER JOIN topic ON mattop.TID = topic.TID
WHERE (topic.topic = 'computer') AND (topic.topic = 'database')
感谢您的帮助。
编辑 - 我知道AND是抱歉的错误。我的意思是如何让它输出具有与之相关的主题的材料。
答案 0 :(得分:7)
您的问题出在where子句中:
WHERE (topic.topic = 'Design') AND (topic.topic = 'Notes')
topic.topic永远不能同时是“设计”和“笔记”。
你的意思是让你成为一个OR吗?
答案 1 :(得分:3)
要获得两个不同的主题,您需要加入两次。 (所以Sonny Boy在问题中是正确的是where子句但是OR不是正确的答案)
类似的东西(注意我没有表,所以没有经过测试的SQL)
编辑说明:对不起,我认为带有2个mattops的原版是正确的,只有一个版本,所以我已经恢复原来的
SELECT * FROM material
INNER JOIN mattop mattop1 ON material.MatID = mattop1.MatID
INNER JOIN topic topic11 ON mattop.TID = topic1.TID
INNER JOIN mattop mattop2 ON material.MatID = mattop2.MatID
INNER JOIN topic topic2 ON mattop.TID = topic2.TID
WHERE (topic1.topic = 'computer') AND (topic2.topic = 'database')
这应该提供计算机和数据库两个主题中使用的材料。 where子句中的简单OR将在至少一个主题中给出材料,但不一定都是
答案 2 :(得分:1)
如果我理解正确,您需要共享相同材料的主题。
这是你如何做到的:
SELECT t1.*,t2.* FROM topic t1
JOIN mattop mt1 ON t1.TID = mt.TID
JOIN mattop mt2 ON mt2.MatID = mt1.MatID
JOIN topic t2 ON t2.TID = mt2.TID
WHERE t2.TID <> t1.TID
这将产生一组共享相同材料的主题列表。
因为SQl将表连接在一起就好像它们是1行/行,所以除非您连接主题表两次,否则不能同时拥有两个不同的主题值