|
|
|
| Замучался я совсем. Подскажите, а лучше поправьте. Мне необходимо чтобы поиск находил полное соответствие(буква в букву) слова. Именно слова а не всего содержимого ячейки. Например в поле есть ячека где записано: Улица разбитых фонарей. Надо так чтоб поиск нашел в случае если в строке поиска было набрано хотя бы одно слово, полностью совпадавшее. Например если набрать: Улица фонариков либо Улицы фонарей, то результат должен быть, так как есть полное соответствие в словах Улица и фонарей, а если слово обрезанное или неправильное окончание, то результата не должно быть, как например Улиц или фон.
$searchfor = preg_replace("/\s/", "|", trim($searchfor));
$searchfor = preg_replace("/^|$/", "'", $searchfor);
if($searchfor!=''){
if ($ser!=actor) {$sql_query = "SELECT * FROM movie WHERE title REGEXP (".$searchfor.") and catalog LIKE '%$ser%'";}
else {$sql_query = "SELECT * FROM movie WHERE actor LIKE (".$searchfor.")";}
$result = mysql_query($sql_query);
$results = mysql_numrows($result);
while ($rows = mysql_fetch_array($result))
{
//выводит найденное поле
} | |
|
|
|
|
|
|
|
для: essan
(20.04.2006 в 07:29)
| | Можно поступить следующим образом
<?php
for($i = 0; $i < count($searchfor); $i++) $searchfor[$i] = " (actor LIKE '".$searchfor[$i]."') ";
$sql_query = "SELECT * FROM movie
WHERE actor ".implode("OR",$searchfor);
?>
|
| |
|
|
|
|
|
|
|
для: cheops
(20.04.2006 в 11:16)
| | Та-же ситуация,только мне надо сравнить поля в Базе данных,
если конкретно,то надо сравнивать данные такого вида:
01.01.1965 и 1965
это будет условием,пока запрос неправилино написан:
UPDATE 1fizik_face,face
SET
1fizik_face.vod_udost=concat(face.ser_vd," ",num_vd),
1fizik_face.dat_vyd_vod=face.dat_vyd,
1fizik_face.stazh=face.stazh
where 1fizik_face.fio=CONCAT(face.fam,",",face.name,",",face.otch)
AND data_rozhd like "%face.dat_rozhd";
|
Таблица 1fizik_face 6 гигабайт.
face 400 мегабайт | |
|
|
|
|
|
|
|
для: hars
(05.07.2006 в 09:03)
| | Запрос работает.
UPDATE tests,face
SET
tests.name1=concat(face.ser_vd," ",num_vd),
tests.name2=face.dat_vyd
where tests.fio=CONCAT(face.fam,",",face.name,",",face.otch) and locate(tests.n1,face.dat_rozhd,2);
|
На тестовой таблице tests где всего пять строчек запись обновлялась почти 4 минуты,нужен более быстрый способ.Подскажите пожалуйста что нужно использовать. | |
|
|
|
|
|
|
|
для: hars
(05.07.2006 в 09:44)
| | Хм... чего-то много... это локальная машина? Как время замеряли? | |
|
|
|
|
|
|
|
для: cheops
(05.07.2006 в 10:01)
| | время замерял глянув на часы,то есть примерно.
Да,пока локальная машина. | |
|
|
|
|
|
|
|
для: hars
(05.07.2006 в 09:44)
| | а в таблице face сколько строк?
Есть ли индексы, и на каких столбцах? | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 10:04)
| | В таблице face 3475455 строк,строки по которым идёт выборка проиндексированы | |
|
|
|
|
|
|
|
для: hars
(05.07.2006 в 10:10)
| | Три с половиной миллиона текстовых записей с функциями в WHERE-условиями... тогда нормально. У вас тип данных у полей face.fam,face.name,face.otch какой и как глубоко они индексированы? | |
|
|
|
|
|
|
|
для: cheops
(05.07.2006 в 10:38)
| | face.fam,face.name,face.otch тип varchar ,т.к. места маловато ,
проиндексированы ,не уникальны,длина 15 | |
|
|
|
|
|
|
|
для: hars
(05.07.2006 в 10:48)
| | Немного поправил запрос,но время опять же 4.32 (минут),хотя обновлние вносил в таблицу где всего 5 записей ,а мне надо сделать тоже самое,только там их 10 миллионов.
UPDATE tests,face SET
tests.name1=concat(face.ser_vd," ",num_vd),
tests.name2=face.dat_vyd
where tests.fio=CONCAT(face.fam,",",face.name,",",face.otch) and locate(tests.n1,face.dat_rozhd,1)>0;
|
Может,в my.ini что-то надо прописать?(таблицы MyISAM) | |
|
|
|
|
|
|
|
для: hars
(05.07.2006 в 11:36)
| | Хм... можно попробовать, у вас сейчас что в my.ini? | |
|
|
|
|
 657 байт |
|
|
для: cheops
(05.07.2006 в 14:10)
| | Вот мой my.ini,теперь всё перенёс на MySQL5
Все поля учавствующие в условии проиндексированы,не уникальны.
В таблице face 3 500 000 записей,обьём 400 мегабайт.
Вот точный запрос,что и куда внести в эти большие базы
UPDATE 1fizik_face,face
SET 1fizik_face.vod_udost=concat(face.ser_vd," ",num_vd),
1fizik_face.dat_vyd_vod=face.dat_vyd
where 1fizik_face.sis_fz<10
and 1fizik_face.fio=CONCAT(face.fam,",",face.name,",",face.otch)
and locate(face.dat_rozhd,1fizik_face. data_rozhd,5)>0;
|
В принципе скрипт заработал,я поставил ограничение на 10 записей в обновляемой таблице и он работал 5минут 51 секунду.Обновил три записи . | |
|
|
|
|
|
|
|
для: hars
(05.07.2006 в 15:28)
| | 1) Хм... а у вас тип таблиц InnoDB? Если измените на MyISAM будет работать быстрее (возможно даже в несколько раз).
2) Сколько вам можно оттяпать оперативной памяти, т.е. сколько её всего на машине?
3) Чем дольше будет работать скрипт, тем быстрее будет идти дело, так как индексы будут подгружаться в кэш оперативной памяти, его конечно лучше сделать побольше
4) Вот это
очень мало, сделайте хотя бы 64М.
5) Вот это тоже не очень много (или оперативной памяти мало у машины)
сюда бы 3/4 оперативной памяти машины нужно... | |
|
|
|
|
|
|
|
для: cheops
(05.07.2006 в 16:44)
| | Спасибо !Сейчас сделаю,памяти к сожалению всего 384 метра.Таблицы MyISAM | |
|
|
|
|
|
|
|
для: hars
(05.07.2006 в 15:28)
| | Ещё можно выставить значение
Можно и больше... | |
|
|
|
|
|
|
|
для: cheops
(05.07.2006 в 16:46)
| | У меня такой вопросик,когда я ставлю условие обновить строки 17<1fizik_face.sis_fz<19,то комп почемуто особо не загружается и похоже вообще ничего не делает,но память под процесс mysqld-nt постоянно растёт,до максимальной отметки в my.ini,странно то что загрузка проца 6-10%,а когда 1fizik_face.sis_fz=18,то сразу заметно :),что процесс пощёл,время его выполнения 33сек.
UPDATE 1fizik_face,face
SET 1fizik_face.vod_udost=concat(face.ser_vd," ",num_vd),
1fizik_face.dat_vyd_vod=face.dat_vyd
where 17<1fizik_face.sis_fz<19
and 1fizik_face.fio=CONCAT(face.fam,",",face.name,",",face.otch)
and locate(face.dat_rozhd,1fizik_face. data_rozhd,5)>0;
|
только что пробовал,до сих пор висит,прошло 3 минуты уже | |
|
|
|
|
|
|
|
для: hars
(05.07.2006 в 18:27)
| | Вам нужно добиться другого способа сопоставления записей.
Например, создать в таблице face еще один столбец с хешем этого самого fio.
Или в другой таблице, если эту стрёмно трогать. В конце концов, есть у нее первичный ключ?
Иначе можно долго так наблюдать MySQLом. Долго и безуспешно. | |
|
|
|
|
|
|
|
для: Trianon
(05.07.2006 в 18:39)
| | Понял,спасибо.Первичный ключ я не создал,вседа думал что это индекс ,индексировал,но видимо не сростается. | |
|
|
|
|