SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 27.02.2012 13:04:18

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Запрос на выборку, исключая некоторые слова

DBO.LOCAL
ID    Admins
1    “Local_Name_1”, “Local_Name_2”
2    “Local_Name_2”, “Local_Name_1”
3    “Local_Name_1”, “Local_Name_2”, “DC\Name_1”, “DC\Name_2”
4    “Local_Name_2”, “DC\Name_2”, “DC\Name_1”
5    “Local_Name_1”, “Local_Name_2”, “DC\Name_1”, “DC\Name_2”, “DC\123
6    “Local_Name_1”, “Local_Name_2”, “DC\Name_2”, “DC\Name_1”, “DC\321
7    “Local_Name_1”, “Local_Name_2”, “DC\Name_1”, “DC\555”, “DC\Name_2”
8    …


SELECT *
FROM DBO.LOCAL
WHERE Name Like ‘%DC\%’

Добрый день!
Подскажите, как в MySQL составить запрос так, чтобы выборка была только по тем строкам,  в который присутствует “%DC\%”, но исключая поиск по именам DC\Name_1 и DC\Name_2.
В данном примере, мне нужно выбрать строки: 5, 6, 7.
Составленный мною запрос выбирает строки: 3, 4, 5, 6, 7

Т.е. по логике нужно составить такой запрос

SELECT *
FROM DBO.LOCAL
WHERE Name Like ‘%DC\[ТУТ МОЖЕТ БЫТЬ ЧТО УГОДНО, ОТЛИЧНОЕ от DC\Name_1 или ОТЛИЧНОЕ от DC\Name_2]'

Неактивен

 

#2 27.02.2012 13:08:15

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос на выборку, исключая некоторые слова

Так и оперируйте like и (not like).


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#3 27.02.2012 13:15:37

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Re: Запрос на выборку, исключая некоторые слова

Если я напишу
LIKE %DC\%
AND NOT LIKE %DC\Name_1%

То, он по идее исключит все строки содержащие %DC\Name_1%, даже те в которые есть %DC\123%
А мне не важно содержит строка %DC\Name_1% или %DC\Name_2%
Важно, чтобы выборка была по тем строкам, в которых есть %DC\[ЛЮБЫЕ СИМВОЛЫ]%, но не нужны те строки, в которых есть %DC\Name_1% или %DC\Name_2%, и нету %DC\[ЛЮБЫЕ СИМВОЛЫ]%

Отредактированно HFShak (27.02.2012 13:16:34)

Неактивен

 

#4 27.02.2012 13:24:39

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Re: Запрос на выборку, исключая некоторые слова

Скажем проще, как мне выбрать строки 3,4,6,10,11 
В данной таблице:




DBO.LOCAL   
ID    Admins
1    “qwerty123”, “qwerty321”
2    “qwerty321”, “qwerty123”, “DC\Name_1”
3    “qwerty123”, “DC\Name_1”, “DC\sadfaf
4    “DC\Name_1”, “DC\Name_2”, “DC\vqevreq
5    “qwerty321”, “qwerty123”, “DC\Name_1”, “DC\Name_2”
6     “DC\tgfwhfb
7    “DC\Name_1”, “DC\Name_2”
8    “DC\Name_2”, “DC\Name_1”
9    “DC\Name_2”, “qwerty321”
10     “DC\fewvewwe”, “DC\Name_1”, “DC\Name_2”
11    “DC\Name_1”, "DC\grejgvbrewj", “DC\Name_2”
12    “qwerty123”, “DC\Name_1”
13    …

Отредактированно HFShak (27.02.2012 13:25:03)

Неактивен

 

#5 27.02.2012 13:25:02

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос на выборку, исключая некоторые слова

Вероятно можно соорудить какой-либо костыль через str_replace, find и прочие функции для работы со строками, но не проще ли было бы дикую структуру преобразовать в более удобоваримую табличку, где имена машин будут храниться не через запятую, а каждое в своей записи?


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#6 27.02.2012 13:28:13

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Re: Запрос на выборку, исключая некоторые слова

deadka написал:

Вероятно можно соорудить какой-либо костыль через str_replace, find и прочие функции для работы со строками, но не проще ли было бы дикую структуру преобразовать в более удобоваримую табличку, где имена машин будут храниться не через запятую, а каждое в своей записи?

Эту таблицу более удобной не сделать, т.к. это список пользователей локальных групп на машинах. Их может быть очень много, не к чему столько столбцов...

Неактивен

 

#7 27.02.2012 13:31:06

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос на выборку, исключая некоторые слова

Я отнюдь не  имел в виду много столбцов. Скорее говорил про
хранение строки “qwerty321”, “qwerty123”, “DC\Name_1” в виде

qwerty321”
“qwerty123”
“DC\Name_1”


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#8 27.02.2012 13:35:09

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Re: Запрос на выборку, исключая некоторые слова

deadka написал:

Я отнюдь не  имел в виду много столбцов. Скорее говорил про
хранение строки “qwerty321”, “qwerty123”, “DC\Name_1” в виде

qwerty321”
“qwerty123”
“DC\Name_1”

Ну может такое и  будет возможно, но не сейчас...

Неактивен

 

#9 27.02.2012 13:39:48

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос на выборку, исключая некоторые слова

HFShak написал:

Если я напишу
LIKE %DC\%
AND NOT LIKE %DC\Name_1%

То, он по идее исключит все строки содержащие %DC\Name_1%, даже те в которые есть %DC\123%

А Вы попробуйте. Если не получится, приложите дамп таблички, поковыряю.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#10 27.02.2012 14:20:53

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Re: Запрос на выборку, исключая некоторые слова

deadka написал:

HFShak написал:

Если я напишу
LIKE %DC\%
AND NOT LIKE %DC\Name_1%

То, он по идее исключит все строки содержащие %DC\Name_1%, даже те в которые есть %DC\123%

А Вы попробуйте. Если не получится, приложите дамп таблички, поковыряю.

Именно так, он исключил все строки содержащие %DC\Name_1% и не важно, что в них кроме DC\Name_1 содержится и DC\wqfasfasf

Неактивен

 

#11 27.02.2012 15:58:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Запрос на выборку, исключая некоторые слова

ИМХО, при такой структуре только через костыль как предлагал deadka ( http://sqlinfo.ru/forum/viewtopic.php?pid=30677#p30677 )
Но такой запрос будет жутко (нет очень ЖУТКО) тормозить. Лучше все-таки изменить структуру.

Неактивен

 

#12 27.02.2012 16:02:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос на выборку, исключая некоторые слова

Ну хочет топикстартер костыль, что ж тут сделаешь.

HFShak, зря дамп не приложили wink. Костыль можно как сделать: с помощью функции replace заменяете неугодные Вам DC\Name_1, DC\Name_2 и прочее на пустую строку. И из получившейся выборки вытягиваете те строки, в которых DC присутствует.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#13 27.02.2012 17:01:48

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Re: Запрос на выборку, исключая некоторые слова

deadka написал:

Ну хочет топикстартер костыль, что ж тут сделаешь.

HFShak, зря дамп не приложили wink. Костыль можно как сделать: с помощью функции replace заменяете неугодные Вам DC\Name_1, DC\Name_2 и прочее на пустую строку. И из получившейся выборки вытягиваете те строки, в которых DC присутствует.

Вообщем как обычно..., excel решает все проблемы.


Кстати, тут подумал насчет такого варианта:

SELECT *
FROM DBO.LOCAL
WHERE Name Like ‘%DC\[^N]%’

Типо выбрает все имена, которые не начинаются на букву "N"
Может в этот духе что-нибудь можно придумать?

Неактивен

 

#14 27.02.2012 17:04:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос на выборку, исключая некоторые слова

Не пойму, при чем тут excel. Последний мой вариант решил задачу?
Механизм regexp есть, да, можно так попробовать.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#15 27.02.2012 17:11:49

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Re: Запрос на выборку, исключая некоторые слова

deadka написал:

Не пойму, при чем тут excel. Последний мой вариант решил задачу?
Механизм regexp есть, да, можно так попробовать.

Я не хочу кастыль, должно быть простое решение выборки.
Я ведь могу задать все возможные слова в LIKE не задавая Name_1 и Name_2, тогда почему я не могу сделать обратного?
Мне просто надо, чтобы слова DC\Name_1 и DC\Name_2 не выбиралась и не не выбирались, а просто пропускалась во время выборки.


Что такое regexp ?, я с sql объщаюсь первый день

Неактивен

 

#16 27.02.2012 17:16:06

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос на выборку, исключая некоторые слова

HFShak написал:

deadka написал:

Не пойму, при чем тут excel. Последний мой вариант решил задачу?
Механизм regexp есть, да, можно так попробовать.

Я не хочу кастыль, должно быть простое решение выборки.

Присоединяюсь ко мнению vasya, что костыль здесь любое другое решение кроме правильной организации хранения данных, которое Вы делать не хотите. replace, регулярное выражение, какие-то хитрые манипуляции - все это костыли в данном случае.

HFShak написал:

Что такое regexp ?, я с sql объщаюсь первый день

Регулярное выражение. К sql это не имеет особого отношения, но в mysql есть механизм для их использования, правда слабенький, см. regexp.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#17 27.02.2012 17:21:50

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Re: Запрос на выборку, исключая некоторые слова

deadka написал:

HFShak написал:

deadka написал:

Не пойму, при чем тут excel. Последний мой вариант решил задачу?
Механизм regexp есть, да, можно так попробовать.

Я не хочу кастыль, должно быть простое решение выборки.

Присоединяюсь ко мнению vasya, что костыль здесь любое другое решение кроме правильной организации хранения данных, которое Вы делать не хотите. replace, регулярное выражение, какие-то хитрые манипуляции - все это костыли в данном случае.

HFShak написал:

Что такое regexp ?, я с sql объщаюсь первый день

Регулярное выражение. К sql это не имеет особого отношения, но в mysql есть механизм для их использования, правда слабенький, см. regexp.

Хорошо, Вопрос №1: скажем у меня пишутся коменты на форуме, как их правильно следует хранить? Минимальное сообщение коментария от 10 слов.
Вопрос №2: Я могу исключить символ из запроса (Where Name Like '%[^N]%'). Возможно ли (путем переменных или как нибудь еще) исключить не символ, а слово? Можно на этот вопрос ответить "да" или "нет"?

Отредактированно HFShak (27.02.2012 17:22:17)

Неактивен

 

#18 27.02.2012 17:26:29

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос на выборку, исключая некоторые слова

1. Если Вы знаете максимальный размер комментария (ну допустим 65535 символов), то сделайте тип varchar(65535).
2. http://dev.mysql.com/doc/refman/5.1/en/regexp.html


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#19 27.02.2012 17:30:39

HFShak
Участник
Зарегистрирован: 27.02.2012
Сообщений: 10

Re: Запрос на выборку, исключая некоторые слова

deadka написал:

1. Если Вы знаете максимальный размер комментария (ну допустим 65535 символов), то сделайте тип varchar(65535).
2. http://dev.mysql.com/doc/refman/5.1/en/regexp.html

SQL server manager studio не понимает, что такое REGEXP , это от субд зависит?

Неактивен

 

#20 27.02.2012 17:38:19

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Запрос на выборку, исключая некоторые слова

HFShak написал:

Подскажите, как в MySQL составить запрос так, чтобы выборка была только по тем строкам,  в который присутствует “%DC\%”, но исключая поиск по именам DC\Name_1 и DC\Name_2.

Данный форум посвящен именно MySQL, а не MSSQL, и всё, что писалось выше относилось именно к MySQL. Есть ли в MSSQL механизм regexp я, честно говоря, просто не знаю, попробуйте задать этот вопрос на соответствующем разделе например на sql.ru.

Но я фактически уверен, что функция типа replace там есть (см. соответсвующий раздел справки), так что предложенный костыль должен сработать и там. MSSQL-сервера под рукой, чтобы проверить также, увы, не имею.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#21 28.02.2012 13:17:54

evgeny
Гуру
Зарегистрирован: 04.05.2009
Сообщений: 335

Re: Запрос на выборку, исключая некоторые слова

Можно сделать так:

SELECT a.*,
ROUND((LENGTH(a.Admins) - LENGTH(REPLACE(a.Admins,'DC',''))) / LENGTH('DC')) 'all_dc',
ROUND((LENGTH(a.Admins) - LENGTH(REPLACE(a.Admins,'Name_',''))) / LENGTH('Name_')) 'dc_name'
FROM DBO.LOCAL a WHERE a.Admins LIKE '%DC%' HAVING all_dc>dc_name;

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson