问题描述
|
我有一个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中不存在数学和计算机科学主题。
解决方法
我将使用子查询,但是也可以使用innerjoins来完成:
SELECT *
FROM `table2`
WHERE `topics` NOT IN (
SELECT DISTINCT(topics)
FROM `table1`
)
, 你可以试试NOT IN
即
SELECT topics FROM table2 where topics NOT IN( select topics from table1)
, 如果您对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
基本上,将table1主题不在table2主题中的任何地方加入表,并计数table1主题以这种方式出现的次数。如果它显示零次,则它存在于表2中的至少一条记录中。
, 通过创建第三个表进行规范化,该表以多对多关系将表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
这将拉动该课程的所有主题。