2009-07-08 3 views
2

Это сводит меня с ума в течение последних нескольких минутMySQL, Принимая во внимание список, выбирая недостающие строки из таблицы

У меня есть таблица, позволяет сказать, table_alphabet с тремя столбцами.

letter(pri) col1 col2 
a   24  55 
b   45  45 
c   23  44 
... 
y   33  55 
z   45  22 

Теперь в моем приложении у меня есть список ('A', 'B', 'лол', 'кошки', 'Z', 'Foo').

Если я

SELECT letter FROM table_alphabet WHERE letter IN ('a', 'b', 'lol', 'cats', 'z', 'foo') 

я получаю только строки, (а, б, г)

То, что я хочу, хотя это, чтобы получить 'лол', 'кошки', 'Foo'. Или на английском языке, какие элементы в моем списке отсутствуют в таблице.

Любая помощь будет оценена по достоинству, у меня, похоже, сегодня есть неисправность мозга.

ответ

-3

Команда NOT IN будет работать даже с нестационарным списком, против которого вы фильтруете. Вы можете использовать подзапрос как:

select letter from table_alphabet where letter NOT IN (select letter from exclude_table) 
+0

Похоже, я не получил опцию, чтобы сделать какие-то таблицы –

+1

Это неправильно, это даст вам буквы из таблицы table_alphabet, которые не находятся в exclude_table (в приведенном выше примере, c, y) –

0

я может быть полностью покинуть базу, но я не думаю, что вы собираетесь достичь этого только SQL в одиночку.

Теперь, если вы загрузили свой список в таблицу, назовите его table_list, а затем присоедините его к таблице table_alphabet и исключите все строки, где алфавит равен нулю, тогда вы можете получить список исключений.

+0

SELECT L.Letter FROM table_list как L LEFT JOIN table_alphabet как A ON L.Letter = A.Letter WHERE A.Letter IS НЕ НОЛЬ –

0

Извините, я полностью неправильно понял вопрос в первый раз. Вам понадобится подзапрос, который может вытащить все буквы из вашего списка в виде строк. Единственный способ, которым я могу думать делать это, UNIONing их все вместе:

select let from (select 'a' as let union select 'b' as let union select 'lol' as let union select 'cats' as let union select 'z' as let union select 'foo' as let) as innerletters where let not in (select letter from table_alphabet); 

Итак, другими словами, ваше приложение должно будет взять список «('a', 'b', 'lol', 'cats', 'z', 'foo')» и переписать его в UNION:

(select 'a' as let union select 'b' as let union select 'lol' as let union select 'cats' as let union select 'z' as let union select 'foo' as let) 

... и вставьте это в запрос. Это должно вернуть буквы из списка, которые не присутствуют в письме колонке table_alphabet таблицы:

+------+ 
| let | 
+------+ 
| lol | 
| cats | 
| z | 
| foo | 
+------+ 
Смежные вопросы