1

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

但是,当我尝试搜索主题以挑选两个具有相同材料的主题时,它不起作用。

示例表:

材料表:

MatID | Name
---------------
1     | book1
2     | note23

话题表:

TID | topic
---------------
1   | computer
2   | database

垫顶桌:

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 是错误对不起。我的意思是如何让它输出与它相关的主题的材料。

4

3 回答 3

7

您的问题出在 where 子句中:

WHERE (topic.topic = 'Design') AND (topic.topic = 'Notes')

topic.topic 不能同时是“设计”和“笔记”。

您的意思是让您的 AND 成为 OR 吗?

于 2009-11-19T19:58:40.273 回答
3

要获得两个不同的主题,您需要加入两次。(所以 Sonny Boy 在问题中是正确的,是 where 子句,但 OR 不是正确答案)

类似的东西(注意我没有表,所以没有测试 SQL)

编辑说明:抱歉,我认为带有 2 个垫子的原始版本是正确的,有一个版本只有一个,所以我已恢复为原始版本

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 将提供至少一个主题的材料,但不一定同时提供

于 2009-11-19T20:08:22.907 回答
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 行/行一样,所以您不能同时拥有两个不同的主题值,除非您在主题表中连接两次

于 2009-11-19T20:09:22.517 回答