运行哪种类型的mysql查询来比较不同表中的两个字段


What type of mysql query do you run to compare two fields in separate tables?

我有一个mysql表(table1),它有以下行:

topic_id: 1
topics: programming
description: A programming language is an artificial language designed to...

我有另一个包含此行的表(表2):

desc_id: 1
description: In mathematics and computer science, an algorithm is an effective...
topics: mathematics, computer science, programming

我想做的是运行一个查询来比较两个主题字段,并让我知道表2中存在哪些主题而表1中不存在

例如,比较上面两个,我想运行一个查询,让我知道表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)

如果您规范化了表2,使主题列表位于一个单独的子表中,那么这将是一个微不足道的查询。就目前情况来看,这很困难,因为默认情况下mysql不会将表2中那些单独的主题视为离散主题。这只是一个很长的字符串,里面恰好有逗号。

值得庆幸的是,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主题不在表2主题中,就连接表,并计算表1主题出现的次数。如果它出现的次数为零,那么它至少出现在表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

这将引出课程的所有主题。