Какой тип запроса MySQL вы запускаете, чтобы сравнить два поля в отдельных таблицах? - PullRequest
0 голосов
/ 30 мая 2011

У меня есть таблица 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

Мне нужно выполнить запрос к сравнить два поля тем и сообщить мне , какие темы существуют в таблице2, а какие нет в таблице1 .

Например, сравнивая два приведенных выше, я хотел бы выполнить запрос, чтобы сообщить мне, что темы математика и информатика не существуют в table1 .

Ответы [ 4 ]

1 голос
/ 30 мая 2011

Я бы использовал подзапрос, но это также можно сделать с помощью внутренних соединений:

SELECT *
FROM `table2`
WHERE `topics` NOT IN (
    SELECT DISTINCT(topics)
    FROM `table1`
)
0 голосов
/ 31 мая 2011

нормализуйте, создав третью таблицу, которая связывает таблицу 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

Это будет тянуть все темы для курса.

0 голосов
/ 30 мая 2011

Если вы нормализовали вашу таблицу2 так, чтобы список тем находился в отдельной вложенной таблице, это был бы тривиальный запрос. В настоящее время это сложно, так как по умолчанию 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.

0 голосов
/ 30 мая 2011

вы можете попробовать НЕ В

т.е.

SELECT topics FROM table2 where topics NOT IN( select topics from table1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...