Вопрос по MySQL, как сделать запрос?
Вот такой вопрос, есть таблица avto в ней столбец marka, со значением напримет 'Cruser'
как выбрать строку со значением Cruser если значение ввведено частично на пример 'Cru' я понял
select * from avto where marka like "%Cru%"
А как сделать если наоборот введено значение длиннее на пример 'Cruser100'
В SQL Oracle можно было бы сделать так:
Код:
select * from avto where marka = substr('Cruser100',1,6)
в MySQL такое тоже есть.
Я так понял что 6 в substr('Cruser100',1,6) зто количество символов в значении поля marka,
но где его взять, ведь придётся делать ещё запрос чтобы узнавать количество символов.
А хотелось бы по проще, я накопал функцию
select * from avto where STRCMP(marka, 'Cruser100')=-1
но она работает еслив хождение начинается с начала строки, иначе нет
а я бы сделала так:
Код:
select * from avto where marka = substr('Cruser100',1,length(marka))
на мой взгляд это не сложно
+
желательно использовать функции upper/lower/Initcap, т.к. ты
не знаешь заранее в каком case пользователь введет данные
Код:
select * from avto where marka = [COLOR=red]initcap[/COLOR][COLOR=red]( [/COLOR]substr('Cruser100',1,length(marka)) [COLOR=red])[/COLOR]
Должна выбирать строки с Cruiser100.
Макс. можно написать
select * from avto where upper(marka) like "%CRUISER100%"
Можно еще через LOCATE()
select * from avto where locate('Cruiser100', name)>0
А если речь идет о substring, то наверно ее нужно применить к полю, а не к строковой константе. Типа
substring(name, 1,7) = 'Cruiser' Или
left(name, 7) = 'Cruiser'
Должна выбирать строки с Cruiser100.
Макс. можно написать
select * from avto where [COLOR=red]upper(marka) like "%CRUISER100%"[/COLOR]
Можно еще через LOCATE()
select * from avto where locate('Cruiser100', name)>0
[/quote]
ну и что это даст если marka == CRUISER ?
в данном случае лайк не поможет +
кто обещал что пользователь введет данные в верхнем регистре?
Цитата:
А если речь идет о substring, [COLOR=red]то наверно ее нужно применить к полю, а не к строковой константе.[/COLOR] Типа
substring(name, 1,7) = 'Cruiser' Или
left(name, 7) = 'Cruiser'
нет разницы, кроме того что эффективно и правильно использовать к входным данным(полученным от пользователя)
Код:
select * from avto where marka = [COLOR=red]initcap[/COLOR][COLOR=red]( [/COLOR]substr(&nameMarka,1,length(marka)) [COLOR=red])[/COLOR]
версии
marka = substr('Cruser100',1,length(marka))
LOCATE(marka, 'Cruser100')>0
marka = initcap( substr(&nameMarka,1,length(marka)) )
не работают
пока работает только
select * from avto where STRCMP(marka, 'Cruser100')=-1
Toyota Landcruiser J100
Toyota Landcruiser PRADO J12
Toyota Landcruiser J9
Пользователь вводит "cruiser100" и нужно чтоб были выбраны те три строки.
Это врятли получится. И это нормально. Если пользователь ввел строку, которая не является подстрокой ни одного значения name, то само собой, что возвращается пустая таблица.
[quote=supergis]
Вот такой вопрос, [COLOR=blue]есть таблица avto в ней столбец marka,[/COLOR] со значением напримет [COLOR=blue]'Cruser'
[/COLOR]как выбрать строку со значением Cruser если значение ввведено частично на пример 'Cru' я понял
select * from avto where marka like "%Cru%"
А [COLOR=blue]как сделать если наоборот введено значение длиннее на пример 'Cruser100'[/COLOR][COLOR=black][/quote][/COLOR]
[COLOR=black][/COLOR]
[COLOR=black]или я что то не понимаю, но самое главное что у автора
наши функции не работают, а это нехорошо[/COLOR]
А хотелось бы по проще, я накопал функцию
select * from avto where STRCMP(marka, 'Cruser100')=-1
[COLOR=blue]но она работает еслив хождение начинается с начала строки[/COLOR], иначе нет[/quote]
если не трудно, объясни подробней что ты имеешь ввиду,
как работает функция strcmp в MySQL не знаю :)
select * from avto where locate(upper(введенная_строка), upper(name))>0 or locate(upper(name), upper(введенная_строка))>0
cruse
cru
cruser
toyota
bmw
а пользователь ввёл 'cruser100'
и нужно выбрать строки похожие на 'cruser100' то есть первые 3
select * from avto where locate(upper(введенная_строка), upper(name))>0 or locate(upper(name), upper(введенная_строка))>0
вроде работает нормально!
я бы например сделал табличку в которой были бы марки машин...при запросе к примеру toyota100 из словаря брались бы марки, в данном случае toyota и проверялось бы вхождение подстроки(из таблицы-словаря) в строку запроса. так мы определим к примеру марку авто ну а дальше уже дело техники... парсим строку запроса берем остальные параметры и првоеряем уже на кузов или движок машини или еще какиенить параметры...можно и запросами типа ааперами и тд...короче зависит от поставленной задачи...
Думаю REGEXP поможет в сложных поисках по подстрокам