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

时间:2011-05-30 17:13:50

标签: php mysql sql phpmyadmin

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

4 个答案:

答案 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

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