MySQL использует анти-объединение для выбора не повторяющихся значений между двумя таблицами - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь выбрать значения из таблицы A на основе значений из таблицы B. Но я не могу понять, что использовать.

Цель:

  • Пользователь на моем веб-сайте получает полный список флажков из таблицы А. на веб-странице.
  • Затем пользователь выбирает флажок, и значение из флажка равно вставлен в таблицу B.
  • В какой-то момент пользователь возвращается на эту веб-страницу и видит только те флажки, которые не были вставлены в таблицу B.

В терминах базы данных я бы использовал запрос на выборку, который сравнивает таблицу A (которая содержит ВСЕ значения) и таблицу B (которая в основном хранит копию значения из таблицы A).

Вот мой запрос. wp_ml_skill_class - это таблица A, а wp_ml_character_skill - это таблица B

SELECT DISTINCT
s.skill_name, s.skill_id, c.char_id, c.um_id, c.class_id
FROM
`wp_ml_skill_class` sc
JOIN
`wp_ml_skill` s 
ON 
(s.skill_id = sc.skill_id)
JOIN 
`wp_ml_character` c
WHERE 
c.class_id = 3 
AND 
c.char_id = 5
AND
sc.skill_id 
NOT IN 
(SELECT cs.skill_id FROM wp_ml_character_skill cs);

1 Ответ

0 голосов
/ 31 августа 2018

Вы можете сделать это с LEFT JOIN между таблицами A и B, проверяя NULL результаты из таблицы B, которые будут представлять строки в таблице A, которых нет в таблице B.

SELECT A.*
FROM wp_ml_skill_class A
LEFT JOIN wp_ml_character_skill B
ON B.skill_id = A.skill_id
WHERE B.skill_id IS NULL

Вот небольшой пример для демонстрации:

create table A (id int, val varchar(10));
create table B (id int, val varchar(10));

insert into A values (1, 'a'), (2, 'b'), (3, 'c');
insert into B values (2, 'b');

SELECT *
FROM  A
LEFT JOIN  B
ON B.id = A.id
WHERE B.id IS NULL

Выход:

id  val     id      val
1   a       (null)  (null)
3   c       (null)  (null)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...