Russian Qt Forum

Qt => Базы данных => Тема начата: kadr от Октябрь 23, 2009, 21:21



Название: Не точный поиск в базе MySQL
Отправлено: 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()));
        } 

Цель:
Допустим при вводе, например Прок, выводил все слова начинающиеся на Прок, при том регистр не должен учитываться!


Название: Re: Не точный поиск в базе MySQL
Отправлено: Пантер от Октябрь 24, 2009, 11:42
Так у тебя запрос ничего не возвращает или ошибку выдает? Попробуй после q.exec(); сделать qDebug(q.lastError().text().toLocal8Bit());


Название: Re: Не точный поиск в базе MySQL
Отправлено: ildar от Октябрь 24, 2009, 14:36
Код:
st = ui->find_l->text() + "%";
q.prepare("SELECT * FROM main WHERE name LIKE :st");

попробуй вот так


Название: Re: Не точный поиск в базе MySQL
Отправлено: kadr от Октябрь 24, 2009, 22:36
Так у тебя запрос ничего не возвращает или ошибку выдает? Попробуй после q.exec(); сделать qDebug(q.lastError().text().toLocal8Bit());

"No data supplied for parameters in prepared statement QMYSQL3: Unable to execute statement"


Название: Re: Не точный поиск в базе MySQL
Отправлено: kadr от Октябрь 24, 2009, 22:37
Код:
st = ui->find_l->text() + "%";
q.prepare("SELECT * FROM main WHERE name LIKE :st");

попробуй вот так
Не не помогает, вообще ничего не возвращает!


Название: Re: Не точный поиск в базе MySQL
Отправлено: MoPDoBoPoT от Октябрь 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);
 


Название: Re: Не точный поиск в базе MySQL
Отправлено: kadr от Октябрь 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();
 :)


Название: Re: Не точный поиск в базе MySQL
Отправлено: kadr от Октябрь 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 поис проходит нормально по двум запросам.


Название: Re: Не точный поиск в базе MySQL
Отправлено: Пантер от Октябрь 26, 2009, 07:06
 ;D Сталкивался я с таким. Нужно делать так:
Код
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();


Название: Re: Не точный поиск в базе MySQL
Отправлено: kadr от Октябрь 26, 2009, 10:14
Хорошо,дома попробую!
 :)


Название: Re: Не точный поиск в базе MySQL
Отправлено: Aleksey_Zh от Октябрь 28, 2009, 10:00
Кстати, kadr, Вам уже предлогали использовать QString.arg для формирования запроса! Там таких заморочек как
Цитировать
:st || '%'
нет!..


Название: Re: Не точный поиск в базе MySQL
Отправлено: Пантер от Октябрь 28, 2009, 12:29
QString.arg не очень хороший подход к формированию запроса.