Russian Qt Forum
Ноябрь 24, 2024, 04:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Не точный поиск в базе MySQL  (Прочитано 10445 раз)
kadr
Гость
« : Октябрь 23, 2009, 21:21 »

Всем привет! Есть задание, организовать поиск в базе данных с последющим выводом результата!
Искал в нете и наткнулься на LIKE, пробую, ничего не получается, пробую тот же запрос через phpmyadmin, все работает, в чем дело, что я пишу не правильно:

st = ui->find_l->text();
q.prepare("SELECT * FROM main WHERE name LIKE ':st%'");
q.bindValue(":st",st);
q.exec();
while (q.next())
        {
            ui->pole->insertRow(row);
            ui->pole->setItem(row,0, new QTableWidgetItem(q.value(1).toString()));
            ui->pole->setItem(row,1, new QTableWidgetItem(q.value(2).toString()));
            ui->pole->setItem(row,2, new QTableWidgetItem(q.value(4).toString()));
            //ui->pole->setItem(row,3, new QTableWidgetItem(q.value(4).toString()));
            ui->pole->setItem(row,4, new QTableWidgetItem(q.value(5).toString()));
            ui->pole->setItem(row,5, new QTableWidgetItem(q.value(7).toString()));
        } 

Цель:
Допустим при вводе, например Прок, выводил все слова начинающиеся на Прок, при том регистр не должен учитываться!
« Последнее редактирование: Октябрь 23, 2009, 21:44 от kadr » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Октябрь 24, 2009, 11:42 »

Так у тебя запрос ничего не возвращает или ошибку выдает? Попробуй после q.exec(); сделать qDebug(q.lastError().text().toLocal8Bit());
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
ildar
Гость
« Ответ #2 : Октябрь 24, 2009, 14:36 »

Код:
st = ui->find_l->text() + "%";
q.prepare("SELECT * FROM main WHERE name LIKE :st");

попробуй вот так
Записан
kadr
Гость
« Ответ #3 : Октябрь 24, 2009, 22:36 »

Так у тебя запрос ничего не возвращает или ошибку выдает? Попробуй после q.exec(); сделать qDebug(q.lastError().text().toLocal8Bit());

"No data supplied for parameters in prepared statement QMYSQL3: Unable to execute statement"
Записан
kadr
Гость
« Ответ #4 : Октябрь 24, 2009, 22:37 »

Код:
st = ui->find_l->text() + "%";
q.prepare("SELECT * FROM main WHERE name LIKE :st");

попробуй вот так
Не не помогает, вообще ничего не возвращает!
Записан
MoPDoBoPoT
Гость
« Ответ #5 : Октябрь 24, 2009, 23:12 »

q.prepare("SELECT * FROM main WHERE name LIKE ':st%'");
q.bindValue(":st",st);
"No data supplied for parameters in prepared statement QMYSQL3: Unable to execute statement"
Правильно, связываемой переменной то нет. То что в запросе между апострафами интерпретируется как строка, поэтому твоего :st "не видно". Чтобы получить то, что ты хочешь, надо сцепить строчки. Например в Oracle операция конкатенации это || (две палки), как в мускуле - не знаю. То есть должно быть примерно так:
Код
C++ (Qt)
q.prepare("SELECT * FROM main WHERE name LIKE :st || '%'");
q.bindValue(":st", st);
 
Записан
kadr
Гость
« Ответ #6 : Октябрь 24, 2009, 23:37 »

q.prepare("SELECT * FROM main WHERE name LIKE ':st%'");
q.bindValue(":st",st);
"No data supplied for parameters in prepared statement QMYSQL3: Unable to execute statement"
Правильно, связываемой переменной то нет. То что в запросе между апострафами интерпретируется как строка, поэтому твоего :st "не видно". Чтобы получить то, что ты хочешь, надо сцепить строчки. Например в Oracle операция конкатенации это || (две палки), как в мускуле - не знаю. То есть должно быть примерно так:
Код
C++ (Qt)
q.prepare("SELECT * FROM main WHERE name LIKE :st || '%'");
q.bindValue(":st", st);
 
Спасибо за мысль, посмотрел в нете про конкатенацию в mysql и нашел вот этот рабочий вариант:
q.prepare("SELECT * FROM main WHERE name LIKE concat(:st,'%')");
q.bindValue(":st", st);
q.exec();
 Улыбающийся
Записан
kadr
Гость
« Ответ #7 : Октябрь 25, 2009, 23:14 »

Поиском по одной таблице теперь все понятно, а вот в двух и более табицах этот поиск не работает, в чем проблема, как заставить искать в 2 табличках:
q.prepare("SELECT name,ostatok,base_chena,postavchik FROM main,uralbiofarm WHERE name LIKE concat(:st,'%')");
q.bindValue(":st",ui->find_l->text());
q.exec()
;

поля name,ostatok,base_chena,postavchik присутствуют в обеех таблицах, притом поиск по каждой таблице в отдельности проходит нормально!
Есто вот такой вариант, нашел в нете:
SELECT name,ostatok,base_chena,postavchik FROM main  WHERE name LIKE concat(:st,'%') UNION ALL SELECT name,ostatok,base_chena,postavchik FROM uralbiofarm  WHERE name LIKE concat(:st,'%')
но он ищет только по аоследнему запросу, хота в phpmyadmin поис проходит нормально по двум запросам.
« Последнее редактирование: Октябрь 25, 2009, 23:45 от kadr » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Октябрь 26, 2009, 07:06 »

 Смеющийся Сталкивался я с таким. Нужно делать так:
Код
C++ (Qt)
q.prepare("SELECT name,ostatok,base_chena,postavchik FROM main  WHERE name LIKE concat(:st,'%') UNION ALL SELECT name,ostatok,base_chena,postavchik FROM uralbiofarm  WHERE name LIKE concat(:st1,'%')");
q.bindValue(":st",ui->find_l->text());
q.bindValue(":st1",ui->find_l->text());
q.exec();
А с точки зрения sql лучше так:
Код
C++ (Qt)
q.prepare("SELECT m.name,m.ostatok,m.base_chena,m.postavchik FROM main AS m  WHERE m.name LIKE concat(:st,'%') UNION ALL SELECT u.name,u.ostatok,u.base_chena,u.postavchik FROM uralbiofarm AS u  WHERE u.name LIKE concat(:st1,'%')");
q.bindValue(":st",ui->find_l->text());
q.bindValue(":st1",ui->find_l->text());
q.exec();
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kadr
Гость
« Ответ #9 : Октябрь 26, 2009, 10:14 »

Хорошо,дома попробую!
 Улыбающийся
Записан
Aleksey_Zh
Гость
« Ответ #10 : Октябрь 28, 2009, 10:00 »

Кстати, kadr, Вам уже предлогали использовать QString.arg для формирования запроса! Там таких заморочек как
Цитировать
:st || '%'
нет!..
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #11 : Октябрь 28, 2009, 12:29 »

QString.arg не очень хороший подход к формированию запроса.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.294 секунд. Запросов: 23.