SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 04.06.2010 23:35:48

jule4ka
Участник
Зарегистрирован: 04.06.2010
Сообщений: 6

Синхронизация двух таблиц

Добрый день,
Подскажите с чего начать.
Есть база данный MySQL, в ней например таблица B со столбцами id(ключ),c,d,e,f. В эту базу парсется таблица A со столбцами id(ключ),b,c,d,e,f. Таблица A содержит строки таблицы В, а так же новые строки.

Нужно проверить, если строка из таблицы А, например №9, есть в таблице В то ничего не делаем. Если строки из таблицы А №9 нет в таблице В, ее нужно поместить на первое место таблицы В.

Второй этап. Если строка №3 из таблицы В, есть в таблице А, то ничего не делаем. Если строки №3 из таблицы В нет в таблицы А то из таблицы В ее надо удалить.

Сравнение строк происходит не по ключу id, а по значению ее полей.

Проще говоря надо добавить новые строки в старую таблицу и удалить устаревшие, при этом оставив без изменения те строки, которые  еще актуальны

Начала со сравнения таблиц. Ищем строчку из первой таблицы, который не во второй и выводим ее. Как место вывода строки поместить ее на первое место таблицы. В первой строке выскакивает ошибка Parse error: syntax error, unexpected T_STRING.

SELECT str, count(*) AS co FROM
(SELECT CONCAT('ZVPRICE', 'ZEQPRICE', 'ZVTH', 'ZSTAGE', 'ZHSTAGE', 'ZMATERID', 'ZAAREA', 'ZRAREA', 'ZKAREA', 'ZVSTREET', 'ZRAIONID', 'ZWCID', 'ZVBAL', 'ZPHONEID', 'O.ZMISC', 'ZVAGPH', 'ZVAGENT') AS str FROM $rooms
UNION
SELECT CONCAT('ZVPRICE', 'ZEQPRICE', 'ZVTH', 'ZSTAGE', 'ZHSTAGE', 'ZMATERID', 'ZAAREA', 'ZRAREA', 'ZKAREA', 'ZVSTREET', 'ZRAIONID', 'ZWCID', 'ZVBAL', 'ZPHONEID', 'O.ZMISC', 'ZVAGPH', 'ZVAGENT') AS str2 FROM $rooms1) AS tmp
GROUP BY str
HAVING co=1") or die(mysql_error());
while ($row = mysql_fetch_array ($res)) {
echo $row["str"]."<br>";
}

Неактивен

 

#2 04.06.2010 23:58:06

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Синхронизация двух таблиц

jule4ka написал:

ее нужно поместить на первое место таблицы В.

что вы под этим понимаете, в смысле под первым местом? id=1? т.е. ключи таблицы B могут быть произвольными и менятся при синхронизации?

Отредактированно Shopen (04.06.2010 23:59:02)

Неактивен

 

#3 05.06.2010 01:03:13

jule4ka
Участник
Зарегистрирован: 04.06.2010
Сообщений: 6

Re: Синхронизация двух таблиц

Хотелось бы чтоб свежие данные выводились на первых местах

Неактивен

 

#4 06.06.2010 00:18:25

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Синхронизация двух таблиц

«Первые места» — понятие очень расплывчатое. Если в запросе SELECT не указан
способ сортировки (ORDER BY) в явном виде, то порядок сортировки, вообще говоря,
может быть произвольным. Раз Вы не стремитесь поддерживать одинаковыми id
(кстати, почему? было бы куда эффективнее по ресурсам и быстрее поддерживать
их одинаковыми), нужно сделать уникальный ключ на полях с данными в таблице A,
и делать

-- Добавить новые строки
INSERT IGNORE INTO A (c,d,e,f) SELECT c,d,e,f FROM B;

-- Удалить старые
DELETE A FROM A LEFT JOIN B ON (A.c = B.c AND A.d = B.d AND …) WHERE B.id IS NULL;

При этом выбирать данные нужно используя ORDER BY id DESC, что гарантирует,
что свежие строки будут находиться в начале выборки.

Неактивен

 

#5 06.06.2010 00:57:31

jule4ka
Участник
Зарегистрирован: 04.06.2010
Сообщений: 6

Re: Синхронизация двух таблиц

Не подойдет. IGNORE INTO работает с ключами таблице, а мне нужно найти соответствие между самим строками, а не их ключами, т.к. разные строки двух таблиц могут иметь одинаковое значение ключа id. Таблицы парсятся с помощью конвертера с дбф. Создается новая таблица, с первым id=1. А уже в ней надо найти новые строки и добавить их в старую таблицу.

Неактивен

 

#6 06.06.2010 16:32:02

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Синхронизация двух таблиц

Ну, если бы Вы внимательно прочитали мое сообщение, то Вы бы поняли, что
ключи — это то, что нужно wink

Почему не поддерживать id я все же не понимаю.

Неактивен

 

#7 06.06.2010 17:20:13

jule4ka
Участник
Зарегистрирован: 04.06.2010
Сообщений: 6

Re: Синхронизация двух таблиц

Потому что таблицы создает стороннее приложение, из него они экспортируются в dbf формате. Строки в таблице не нумеруются. id появляется при конвертировании таблиц из dbf формата. id заполняются по формуле id=1 id=id+1. Для того чтобы одинаковым записям двух разных таблиц присвоить одинаковый id, нужно в любом случае сравнивать сами записи. Или я не права?

Неактивен

 

#8 06.06.2010 17:23:58

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Синхронизация двух таблиц

Просто в изначальной постановке задачи Вы говорили, что id есть smile
Тогда уникальный ключ, INSERT IGNORE, DELETE smile

Неактивен

 

#9 06.06.2010 18:50:03

jule4ka
Участник
Зарегистрирован: 04.06.2010
Сообщений: 6

Re: Синхронизация двух таблиц

id есть, но сравнивать по нему не получится
Подскажите еще а вот с этим как бороться? Запрос все тот же
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') or die(mysql_error())' at line 6

Неактивен

 

#10 07.06.2010 20:46:00

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Синхронизация двух таблиц

Это вопрос по PHP wink

Вы забыли где-то закрыть кавычку, и часть кода PHP попала в MySQL.

Неактивен

 

#11 07.06.2010 21:43:19

Shopen
Гуру
Откуда: Москва
Зарегистрирован: 22.10.2007
Сообщений: 362

Re: Синхронизация двух таблиц

jule4ka написал:

id есть, но сравнивать по нему не получится

честно говоря - ничего не понятно. Попробуйте проиллюстрировать вашу задачу на небольшом кусочке реальных данных. Что есть, что должно получится и при каких обстоятельствах.

Поместить строку в начало таблицы нельзя, если только перевоссоздать ее заново в нужном порядке. Если вы сделаете поле с датовременем вставки строк, а потом будете выбирать с сортировкой по этому полю - то получите, что самые свежие записи будут первыми.

Неактивен

 

#12 13.06.2010 00:48:25

jule4ka
Участник
Зарегистрирован: 04.06.2010
Сообщений: 6

Re: Синхронизация двух таблиц

1. Не могу выделить максимальный id
echo $im['id']; выводит Array

2. Не работает INSERT, хотя сам поиск работает, но новую строку в таблицу не хочет вставлять ни в какую. Подскажите с чем это может быть связано
Код PHP


<?php

//$imax = mysql_query("SELECT * FROM rooms",$db);
//echo $imax["id"];
$imax = "SELECT MAX(id) FROM `rooms`";
$imi=mysql_query($imax);
$im = mysql_fetch_array($imi);

//print_r($imi);
//echo $im['id'];
//echo $im["id"];
for($i=1;$i<=$im;$i++){
echo "i=".$i."<br>";

$res=mysql_query("select * from `rooms` where id='$i'");



$row=mysql_fetch_array($res);
//echo $row["id"];
echo $row["ZRAIONID"];
//print_r($row);
$j=50;

//$sql=0;
$sql="SELECT id FROM `rooms1` WHERE ZRAIONID='$row[ZRAIONID]' AND ZVSTREET='$row[ZVSTREET]' AND ZVPRICE='$row[ZVPRICE]'";
$sql_1 = mysql_query($sql);
$sql_2 = mysql_fetch_array($sql_1);
//echo $sql_2["id"]."<br>";

if($sql_2[id]!="")
{ echo $sql_2["id"]."<br>";


}
else{
//$art=mysql_query("INSERT INTO `rooms1` select * from `rooms` where id='$i'");
//$dar=mysql_query("INSERT IN `rooms1` SET (50,{$row['ZVPRICE']}, {$row['ZEQPRICE']}, {$row['ZVTH']}, {$row['ZSTAGE']}, {$row['ZHSTAGE']}, {$row['ZMATERID']}, {$row['ZAAREA']},{$row['ZRAREA']}, {$row['ZKAREA']}, {$row['ZVSTREET']}, {$row['ZRAIONID']}, {$row['ZWCID']}, {$row['ZVBAL']}, {$row['ZPHONEID']}, {$row['O.ZMISC']}, {$row['ZVAGPH']}, {$row['ZVAGENT']}, 0, 0, 0)") ;
$dar=mysql_query("INSERT INTO 'rooms1' ('id', 'ZVPRICE', 'ZEQPRICE', 'ZVTH', 'ZSTAGE', 'ZHSTAGE', 'ZMATERID', 'ZAAREA', 'ZRAREA', 'ZKAREA', 'ZVSTREET', 'ZRAIONID', 'ZWCID', 'ZVBAL', 'ZPHONEID', 'O.ZMISC', 'ZVAGPH', 'ZVAGENT', 'img1', 'img2', 'img3') VALUES ('&j+1', '$row[ZVPRICE]', '$row[ZEQPRICE]', '$row[ZVTH]', '$row[ZSTAGE]', '$row[ZHSTAGE]', '$row[ZMATERID]', '$row[ZAAREA]','$row[ZRAREA]', '$row[ZKAREA]', '$row[ZVSTREET]', '$row[ZRAIONID]', '$row[ZWCID]', '$row['ZVBAL']', '$row[ZPHONEID]', '$row['O.ZMISC']', '$row[ZVAGPH]', '$row[ZVAGENT]', 0, 0, 0)");
echo $dar;
echo ("no")."<br>";
}


//$r=mysql_fetch_array(mysql_query($sql));



}

?>

Отредактированно jule4ka (13.06.2010 00:49:09)

Неактивен

 

#13 13.06.2010 00:56:30

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Синхронизация двух таблиц

Пожалуйста, задавайте вопросы по PHP на webew.ru. Этот форум правда
не выдержит обсуждений PHP smile

P.S. научитесь дебажить свой код самостоятельно. Учитесь использовать
$query = '...';
print ($query);
mysql_query($query);
print (mysql_error());

P.P.S. Вместо &j+1 Вы имели в виду $j+1. И эту ошибку Вы могли бы найти
самостоятельно.

P.P.P.S. И таки webew.ru.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson