AND的SQL查询问题

时间:2009-11-19 19:56:35

标签: sql inner-join

我有一个表,其中包含保存材料的另一个主题类型。然后,我有另一个表,其中包含每个表的键,从而创建多对多的关系。

然而,当我尝试搜索主题以挑选出两个共享相同材料的主题时,它不起作用。

示例表:

材料表:

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是抱歉的错误。我的意思是如何让它输出具有与之相关的主题的材料。

3 个答案:

答案 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行/行,所以除非您连接主题表两次,否则不能同时拥有两个不同的主题值