Выполнить запрос по результату запроса MySQL - PullRequest
0 голосов
/ 14 июля 2020

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

SELECT * FROM table1 WHERE id IN(list_of_ids);

Обратите внимание, что «list_of_ids» - это список, содержащий 274 числа, как в примере ниже (в формате (number1, number2, number3)

+---------+   
|   id    |   
+---------+   
|  112234 |       
|  345657 |  
|   45332 |        
| 1234665 |     
|  213423 |  
+---------+

Я получил 151 строку, так что есть некоторые идентификаторы, о которых я не знаю информации. Я хочу посмотреть, какие это идентификаторы, просто чтобы проверить качество и посмотреть, есть ли произошла какая-то ошибка с запросом / опечаткой, или у меня действительно нет информации о них (в чем я сомневаюсь).

Я пробовал некоторые методы, которые я нашел при поиске, но ни один из них не работал (например, используя функцию VALUES и создавая временные таблицы)

Я знаю, что могу просто создать новую таблицу со столбцом и этими значениями, а затем сделать что-то в строке

SELECT * id2 FROM table2 JOIN table1 WHERE id2 NOT LIKE id1";

(не тестировал это, но я думаю, это может сработать)

Но я чувствую, что это то, с чем я буду часто сталкиваться в будущем, поэтому я предпочитаю более прямой способ сделать это, а не создавать стол каждый раз. Также я думаю, что обучение более прямым способом предпочтительнее, чем создание и удаление таблиц для «простых» задач вроде этой

Есть ли способ сделать что-то вроде

SELECT id2 FROM subquery JOIN table1 WHERE id2 != id1 FROM (SELECT * FROM table1 WHERE id IN (list_of_ids)) AS subquery;

Я знаю, это было бы никогда не работаю, а просто чтобы показать то, чего я хочу достичь. Извините за кровотечение!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 15 июля 2020

Односторонний ответ.

Например, table1 выглядит следующим образом:

create table table1 (id1 int);
insert into table1 values (12345),(112234),(345657),(213423),(223344);

table2 требуется рекурсивный вызов с использованием предложения WITH (который является обычным способом расширения до нескольких ряды). Таким образом, list_of_ids необходимо рассматривать как символьную константу.

with recursive table2(id2,wk_ids) as (
  select cast(NULL as signed), '112234,345657,45332,1234665,213423' as list_of_ids
  union select
    cast(substring_index(wk_ids,',',1) as signed),
    substring(wk_ids,instr(wk_ids,',')+1)
    from table2 where wk_ids<>''
)
select id2 from table1 right outer join table2 on id1=id2 where id1 is null and id2 is not null;
0 голосов
/ 14 июля 2020

Просто используйте функцию UNION с NOT IN во второй части, например:

SELECT * FROM table1 WHERE id IN(list_of_ids) UNION SELECT * FROM table1 WHERE id NOT IN(list_of_ids);

Надеюсь, это то, что вам нужно.

...