; файл настроек для создания словаря
[fromDataBase]
dbHost = 127.0.0.1
dbPort = 3306
dbUser = root
dbPass = 123
dbName = db1
dbTable = test_table1
dbIdField = id
dbValField = str
[toDataBase]
dbHost = 127.0.0.1
dbPort = 3306
dbUser = root
dbPass = 123
dbName = db1
dbTable = test_table2
dbPrimaryId = id
dbForeignId = parent
dbValField = str
[custom]
perIt = 200
mysql словарь
можно ли в mysql несколькими запросами создать таблицу, в которой будут все слова из поля другой таблицы и ссылка туда, где это слово есть? или формирование такой таблицы возможно только с помощью языка (php например)?
поэтому переносим в БД тему.
Цитата: Mr.Hacker
можно ли в mysql несколькими запросами создать таблицу, в которой будут все слова из поля другой таблицы и ссылка туда, где это слово есть? или формирование такой таблицы возможно только с помощью языка (php например)?
Создаете таблицу с 3-мя полями. В 1-м поле primary key, во 2-м поле foreign key - ссылка на записи "другой" таблицы. 3-е поле хранит слово. Далее открываете документацию по MySQL и ищете операции со строками. И вперед.
допустим мне надо только слова, разделённые пробелами.. ничего похожего на explode() нету, соответственно делаем что-то типа SELECT SUBSTRING(field, 0, LOCATE(' ', field)).. так получаем только первое слово.. а как в одном запросе получить все слова из строки?
Код:
<?
ob_start();
$settings = parse_ini_file(dirname( __FILE__).'/makeDict.ini', true);
$fromHandle = new mysqli($settings['fromDataBase']['dbHost'],
$settings['fromDataBase']['dbUser'],
$settings['fromDataBase']['dbPass'],
$settings['fromDataBase']['dbName'],
$settings['fromDataBase']['dbPort']
);
$toHandle = new mysqli( $settings['toDataBase']['dbHost'],
$settings['toDataBase']['dbUser'],
$settings['toDataBase']['dbPass'],
$settings['toDataBase']['dbName'],
$settings['toDataBase']['dbPort']
);
$toHandle->autocommit(FALSE);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($res = $fromHandle->real_query('SELECT COUNT(*) as count FROM '.$settings['fromDataBase']['dbTable'])) {
$row = $res->fetch_assoc();
$count = $row['count'];
}
else exit();
$insText = 'INSERT INTO '.$settings['toDataBase']['dbTable'].' ('.$settings['toDataBase']['dbPrimaryId'].','.$settings['toDataBase']['dbForeignId'].','.$settings['toDataBase']['dbValField'].') VALUES ';
for ($i = 0; $i < $count; $i += $settings['custom']['perIt']) {
if ($res = $fromHandle->real_query('SELECT '.$settings['fromDataBase']['dbIdField'].' as id,'.$settings['fromDataBase']['dbValField'].' as val FROM '.$settings['fromDataBase']['dbTable'].' LIMIT '.$i.', '.$settings['custom']['perIt'])) {
$txt = $insText;
while ($row = $res->fetch_assoc()) {
$words = explode(' ', $row['val']);
foreach ($words as $word)
$txt .= '(NULL, '.$row['id'].', \''.$word.'\'),';
}
}
else exit();
$txt = substr($txt, 0, strlen($txt)-1);
$txt .= ';';
$toHandle->real_query('LOCK TABLES '.$settings['toDataBase']['dbTable'].' WRITE');
$f = $toHandle->query($txt);
$toHandle->commit();
if (!$f)
$toHandle->rollback();
$toHandle->real_query('UNLOCK TABLES');
echo 'Completed '.$i.'\n';
flush();
}
?>
ob_start();
$settings = parse_ini_file(dirname( __FILE__).'/makeDict.ini', true);
$fromHandle = new mysqli($settings['fromDataBase']['dbHost'],
$settings['fromDataBase']['dbUser'],
$settings['fromDataBase']['dbPass'],
$settings['fromDataBase']['dbName'],
$settings['fromDataBase']['dbPort']
);
$toHandle = new mysqli( $settings['toDataBase']['dbHost'],
$settings['toDataBase']['dbUser'],
$settings['toDataBase']['dbPass'],
$settings['toDataBase']['dbName'],
$settings['toDataBase']['dbPort']
);
$toHandle->autocommit(FALSE);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
if ($res = $fromHandle->real_query('SELECT COUNT(*) as count FROM '.$settings['fromDataBase']['dbTable'])) {
$row = $res->fetch_assoc();
$count = $row['count'];
}
else exit();
$insText = 'INSERT INTO '.$settings['toDataBase']['dbTable'].' ('.$settings['toDataBase']['dbPrimaryId'].','.$settings['toDataBase']['dbForeignId'].','.$settings['toDataBase']['dbValField'].') VALUES ';
for ($i = 0; $i < $count; $i += $settings['custom']['perIt']) {
if ($res = $fromHandle->real_query('SELECT '.$settings['fromDataBase']['dbIdField'].' as id,'.$settings['fromDataBase']['dbValField'].' as val FROM '.$settings['fromDataBase']['dbTable'].' LIMIT '.$i.', '.$settings['custom']['perIt'])) {
$txt = $insText;
while ($row = $res->fetch_assoc()) {
$words = explode(' ', $row['val']);
foreach ($words as $word)
$txt .= '(NULL, '.$row['id'].', \''.$word.'\'),';
}
}
else exit();
$txt = substr($txt, 0, strlen($txt)-1);
$txt .= ';';
$toHandle->real_query('LOCK TABLES '.$settings['toDataBase']['dbTable'].' WRITE');
$f = $toHandle->query($txt);
$toHandle->commit();
if (!$f)
$toHandle->rollback();
$toHandle->real_query('UNLOCK TABLES');
echo 'Completed '.$i.'\n';
flush();
}
?>
собсна makeDict.ini чё-то типа такого:
Код:
кто поможет оптимизировать?
и может тему обратно перенести в web-программирование?
Цитата: Mr.Hacker
кто поможет оптимизировать?
и может тему обратно перенести в web-программирование?
и может тему обратно перенести в web-программирование?
Можно и перенести.Только почему нельзя оформить это в виде хранимой процедуры на сервере?