我有一个mysql表( table1 ),其中包含以下行:
topic_id: 1
topics: programming
description: A programming language is an artificial language designed to...
我有另一张表格( table2 ):
desc_id: 1
description: In mathematics and computer science, an algorithm is an effective...
topics: mathematics, computer science, programming
我要做的是运行一个查询比较两个主题字段,让我知道 table2中存在哪些不存在于table1中的主题。
例如,比较上面两个,我想运行一个查询,让我知道中不存在数学和计算机科学主题表1
答案 0 :(得分:1)
我会使用子查询,但也可以使用innerjoins来完成:
SELECT *
FROM `table2`
WHERE `topics` NOT IN (
SELECT DISTINCT(topics)
FROM `table1`
)
答案 1 :(得分:0)
你可以试试NOT IN
即
SELECT topics FROM table2 where topics NOT IN( select topics from table1)
答案 2 :(得分:0)
如果您对table2进行了规范化,以便主题列表位于单独的子表中,那么这将是一个简单的查询。就目前而言,它很难,因为默认情况下mysql不会将table2.topics中的那些单独主题看作离散主题。它只是一个很长的字符串,恰好有逗号。
值得庆幸的是,MySQL具有find_in_set()
功能,这可以帮助很大,但是这个功能在其他地方不可用。无法访问您的数据集,我只是在这里猜测,但这应该可以解决问题:
SELECT table1.topics, count(table1.topic_id) AS cnt
FROM table1
LEFT JOIN table2.topics ON FIND_IN_SET(table1.topics, table2.topics) = 0
GROUP BY table1.topics
HAVING cnt = 0
基本上,将表1主题不在table2主题中的表加入表中,并计算table1主题显示的次数。如果它显示零次,那么它出现在table2中的至少一个记录中。
答案 3 :(得分:0)
通过创建第三个表来规范化,第三个表将表2与表1链接,具有多对多的关系。
Table_1
id, etc
Table_2
id, etc
Table_3
id, table1_id, table2_id
然后,您可以使用简单连接来创建将提取相关数据的查询
SELECT * FROM Table_1 LEFT JOIN Table_3 ON Table_1.id = Table_3.table1_id WHERE Table_3.table2_id = $table2_id
这将拉出课程的所有主题。