Страницы: 1
RSS
Получить данные из MySQL, Прошу помощи в построении запроса
 
Доброго времени суток всем!
  В MySQL есть БД "jornal" с таблицей "adres". Таблица состоит из столбцов | iD_Adres | Город | Улица | Дом | Буква | Корп | Кв |. Необходимо произвести поиск по таблице согласно образца адреса который находится в TextBox. Маска адреса выглядит так: "Кропивницький, просп. Леваневского, 24-А корп.1 кв.101", но при поиске пользователь может указать и что-то одно к примеру только № квартиры. В таком случае образец будет таким: "кв.101".
  Для этого решил сделать поиск по базе превращая  значения строк в маску:
Код
"SELECT * " & _
"FROM (SELECT (IF(Город='Кропивницький','',Город & ', ')  & Улица & ', ' & IF(Дом>'', Дом,'') & IF(Буква='','','-' & Буква) & IF(Корп>0,' корп.' & Корп,'') & IF(Кв>0,' кв.' & Кв,'')) AS AD From jornal.adres) AS t1 " & _
"WHERE AD LIKE '%" & Me.TB3.Text & "%'"
Recordset возвращает 17 строк, но все пустые. Подскажите пожалуйста, как найти все строки в которых есть сходство с указанным значением? Всем спасибо заранее!
П.С. прошу меня простить если не очень четко объяснил.
 
Здравствуйте.
Цитата
Ronin751 написал:
как найти все строки
Для начала надо хоть немного изучить Mysql.
Строки объединяются через строковую функцию CONCAT.
Пояснил на фрагменте.
Код
Есть IF(Город='Кропивницький','',Город & ', ')  & Улица & ', ' & IF(Дом>'', Дом,'') 
Должно быть
CONCAT(IF(Город='Кропивницький','',CONCAT(Город , ', ') ),Улица,', ',IF(Дом>'', Дом,'')) 

PS:Использование кириллицы в именах столбцов совсем не айс.Попробуйте создать поле с именем яндекс.
Изменено: Doober - 26.08.2017 15:45:51
 
Цитата
Строки объединяются через строковую функцию CONCAT
Спасибо Вам Doober за подсказку. Не знал. Вечером, на работе попробую и отпишусь. Но что же тогда находит запрос при моём варианте Select?!
П.С, По поводу изучения Вы конечно же правы. По мере необходимости изучаю понемногу.  
 
Запрос возвращает данные  согласно не верного запроса.
 
Пробовал выборку с CONCAT. Получил следующее:
Код
"SELECT *,CONCAT(
IF(Город='Кропивницький','',CONCAT(Город,', ')),
Улица,', ',
IF(Дом='','',Дом),
IF(Буква='','',CONCAT('-',Буква)),
IF(Корп=0,'',CONCAT(' корп.',Корп)),
IF(Кв=0,'',CONCAT(' кв.',Кв))) AS AD
FROM jornal.adres GROUP BY iD_Adres HAVING AD LIKE '%" & Me.TB3.Text & "%'"
 Вроде бы выборка и работает, да вот только в том случае если вводишь цифры или знаки. В случае наличия в TextBoxe любой буквы или текста, итог получается нулевым.
 Долго не мог понять причины сего, но как оказалось ответ довольно прост - Кириллица. Т.к. все текстовые значения в БД внесены кириллицей, MySQL упорно не хочет его обрабатывать в ново созданном столбце "AD". Но интересно и то, что если поиск производить по отдельному столбцу (к примеру Город), то кириллица нормально определяется. Сие мне не понятно. И уж тем более не понятно, как достичь желаемого результата?!
 Вот пример таблицы БД и пример формы с запросом. Заранее благодарен всем и буду рад любому совету.
 
Цитата
Doober написал:
PS:Использование кириллицы в именах столбцов совсем не айс.
Какая кодировка базы данных?
 
Кодировка cp1251.
Цитата
PS:Использование кириллицы в именах столбцов совсем не айс.
Поиск сходств происходит по создаваемому запросом столбцу AD. Только в этом столбце зарос не может определить кириллицу в строках. А во всех других столбцах кириллица в строках определяется. Что это значит я не знаю, но думаю, что всё дело не в именах столбцов, т.к. новому то столбце присвоено значение "AD" не являющиеся кириллицей.
 
От безвыходности и правды ради создал тестовую таблицу:
Код
CREATE TABLE `addres` (
   `iD_Adres` INT(11) NOT NULL AUTO_INCREMENT,
   `Data` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
   `City` TEXT NOT NULL,
   `Street` TEXT NOT NULL,
   `House` TEXT NULL,
   `Leter` TEXT NULL,
   `Korp` INT(11) NULL DEFAULT '0',
   `Kv` INT(11) NULL DEFAULT '0',
   PRIMARY KEY (`iD_Adres`)
)
COLLATE='cp1251_general_ci'
ENGINE=InnoDB
;
Внес в нее такие же данные и выполнил ту же выборку:
Код
"SELECT *,CONCAT(
IF(City='Кропивницький','',CONCAT(City,', ')),
Street,', ',
IF(House='','',House),
IF(Leter='','',CONCAT('-',Leter)),
IF(Korp=0,'',CONCAT(' корп.',Korp)),
IF(Kv=0,'',CONCAT(' кв.',Kv))) AS AD
FROM jornal.addres GROUP BY iD_Adres HAVING AD LIKE '%" & Me.TB3.Text & "%'"
Результат не изменился даже после изменения названий столбцов на англоязычные: отбор успешный только в том случае,если искомый текст представлен не буквенными значениями.  :cry:  
 
Цитата
Ronin751 написал:
отбор успешный только в том случае
Не может быть.Вы не правильно готовите блюдо
 
Doober, если Вас не затруднит, не могли бы Вы повторить у себя:
Код
INSERT INTO `ronin`.`addres` (`Data`, `City`, `Street`, `House`, `Leter`, `Korp`, `Kv`) VALUES ('2017-08-27 21:55:49', 'Кропивницький', 'вул. Заміська', '3/4', 'В', '1', '125');
INSERT INTO `ronin`.`addres` (`Data`, `City`, `Street`, `House`,`Leter`, `Kv`) VALUES ('2017-08-27 21:56:21', 'Зоря', 'пров. Дачний', '12','','1');
INSERT INTO `ronin`.`addres` (`City`, `Street`, `House`,`Leter`) VALUES ('Кропивницький', 'вул. Мічуріна', '13','');
А затем выполнить Ваш скрипт, но с поиском значения  AD LIKE '%Зоря%' или AD LIKE '%Дачний%'
У меня при этом результат негативный. И создается впечатление, что находит только те значения, которые указаны в скрипте (корп., кв.), а табличные нет.
 
Мне лень много буковок набивать, и так верно работает.
 
У меня нет.
Страницы: 1
Читают тему
Наверх