MySQL, учитывая список, выбирая недостающие строки из таблицы - PullRequest
2 голосов
/ 08 июля 2009

Это сводило меня с ума в течение последних нескольких минут

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

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

Теперь в моем приложении есть список («a», «b», «lol», «cats», «z», «foo»).

Если я делаю

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

Я получаю только строки, (a, b, z)

Что я хочу, так это получить 'lol', 'cats', 'foo'. Или по-английски, какие элементы в моем списке отсутствуют в таблице.

Буду признателен за любую помощь, у меня сегодня, похоже, нарушение работы мозга.

Ответы [ 3 ]

0 голосов
/ 08 июля 2009

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

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

0 голосов
/ 08 июля 2009

Извините, я неправильно прочитал вопрос в первый раз. Вам понадобится подзапрос, который может вытянуть все буквы в вашем списке в виде строк. Единственный способ, которым я могу думать об этом, это ОБЪЕДИНИТЬ их всех вместе:

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  |
+------+
0 голосов
/ 08 июля 2009

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

select letter from table_alphabet where letter NOT IN ( select letter from exclude_table )
...