Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день,
Подскажите с чего начать.
Есть база данный 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>";
}
Неактивен
jule4ka написал:
ее нужно поместить на первое место таблицы В.
что вы под этим понимаете, в смысле под первым местом? id=1? т.е. ключи таблицы B могут быть произвольными и менятся при синхронизации?
Отредактированно Shopen (04.06.2010 23:59:02)
Неактивен
Хотелось бы чтоб свежие данные выводились на первых местах
Неактивен
«Первые места» — понятие очень расплывчатое. Если в запросе 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, что гарантирует,
что свежие строки будут находиться в начале выборки.
Неактивен
Не подойдет. IGNORE INTO работает с ключами таблице, а мне нужно найти соответствие между самим строками, а не их ключами, т.к. разные строки двух таблиц могут иметь одинаковое значение ключа id. Таблицы парсятся с помощью конвертера с дбф. Создается новая таблица, с первым id=1. А уже в ней надо найти новые строки и добавить их в старую таблицу.
Неактивен
Ну, если бы Вы внимательно прочитали мое сообщение, то Вы бы поняли, что
ключи — это то, что нужно
Почему не поддерживать id я все же не понимаю.
Неактивен
Потому что таблицы создает стороннее приложение, из него они экспортируются в dbf формате. Строки в таблице не нумеруются. id появляется при конвертировании таблиц из dbf формата. id заполняются по формуле id=1 id=id+1. Для того чтобы одинаковым записям двух разных таблиц присвоить одинаковый id, нужно в любом случае сравнивать сами записи. Или я не права?
Неактивен
Просто в изначальной постановке задачи Вы говорили, что id есть
Тогда уникальный ключ, INSERT IGNORE, DELETE
Неактивен
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
Неактивен
Это вопрос по PHP
Вы забыли где-то закрыть кавычку, и часть кода PHP попала в MySQL.
Неактивен
jule4ka написал:
id есть, но сравнивать по нему не получится
честно говоря - ничего не понятно. Попробуйте проиллюстрировать вашу задачу на небольшом кусочке реальных данных. Что есть, что должно получится и при каких обстоятельствах.
Поместить строку в начало таблицы нельзя, если только перевоссоздать ее заново в нужном порядке. Если вы сделаете поле с датовременем вставки строк, а потом будете выбирать с сортировкой по этому полю - то получите, что самые свежие записи будут первыми.
Неактивен
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)
Неактивен
Пожалуйста, задавайте вопросы по PHP на webew.ru. Этот форум правда
не выдержит обсуждений PHP
P.S. научитесь дебажить свой код самостоятельно. Учитесь использовать
$query = '...';
print ($query);
mysql_query($query);
print (mysql_error());
P.P.S. Вместо &j+1 Вы имели в виду $j+1. И эту ошибку Вы могли бы найти
самостоятельно.
P.P.P.S. И таки webew.ru.
Неактивен