Php 您运行什么类型的mysql查询来比较不同表中的两个字段?

Php 您运行什么类型的mysql查询来比较不同表中的两个字段?,php,mysql,sql,phpmyadmin,Php,Mysql,Sql,Phpmyadmin,我有一个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... topic

我有一个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

中,您可以尝试不存在

i、 e


我会使用子查询,但也可以使用InnerJoin完成:

SELECT *
FROM `table2`
WHERE `topics` NOT IN (
    SELECT DISTINCT(topics)
    FROM `table1`
)

如果规范化了table2,使主题列表位于单独的子表中,那么这将是一个简单的查询。就目前而言,这很困难,因为默认情况下mysql不会将表2.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
这将引出本课程的所有主题

SELECT * FROM Table_1 LEFT JOIN Table_3 ON Table_1.id = Table_3.table1_id WHERE Table_3.table2_id = $table2_id