[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: сравнить две таблицы
кекс
помогите решить задачу. собственно есть 2 таблицы, нужно создать запрос так, что бы вывести результат несоответствия двух таблиц. возможно изменение в строке. а возможно и отсутствие строки...




Спустя 20 минут, 23 секунды (14.06.2007 - 10:33) Ghost написал(а):
что значит "несоответствие таблиц"?

Спустя 59 минут, 3 секунды (14.06.2007 - 11:32) кекс написал(а):
Цитата(Ghost @ 14.6.2007, 11:33) [snapback]22676[/snapback]
что значит "несоответствие таблиц"?

нда.. в смысле несоответствие данных в таблицах..

| id | name | street | phone | chto-to |
| 1 | name 1 | street 1 | phone 1 | chto-to 1 |
| 2 | name 2 | street 2 | phone 2 | chto-to 2 |
| 3 | name 3 | street 3 | phone 3 | chto-to 3 |
| 4 | name 4 | street 4 | phone 4 | chto-to 4 |
| 5 | name 5 | street 5 | phone 5 | chto-to 5 |
| 6 | name 6 | street 6 | phone 6 | chto-to 6 |
| 7 | name 7 | street 7 | phone 7 | chto-to 7 |


| id | name | street | phone | chto-to |
| 1 | name 1 | street 1 | phone 1 | chto-to 1 |
| 2 | name 2 | street 2 | phone 2 | chto-to 2 |
| 3 | name 4 | street 4 | phone 4 | chto-to 4 |
| 4 | name 5 | street 5 | phone 535 | chto-to 5 |
| 5 | name 6 | street 6 | phone 6 | chto-to 6 |
| 6 | name 7 | street 7 | phone 7 | chto-to 7 |

вот пример таблиц...

Спустя 18 минут, 52 секунды (14.06.2007 - 11:51) Ghost написал(а):
можешь попробовать что-нить вроде этого

select count(id) as co from
(select * from tab1
union
select * from tab2) as tmp
group by id
having co=1 or MIN(`name`)<>MAX(`name`) or MIN(`street`)<>MAX(`street`) or ....

PS: оптимизация в даном запросе отсутствует впринцыпе

Спустя 1 час, 8 минут, 11 секунд (14.06.2007 - 12:59) кекс написал(а):
Цитата(Ghost @ 14.6.2007, 12:51) [snapback]22685[/snapback]
можешь попробовать что-нить вроде этого

select count(id) as co from
(select * from tab1
union
select * from tab2) as tmp
group by id
having co=1 or MIN(`name`)<>MAX(`name`) or MIN(`street`)<>MAX(`street`) or ....

PS: оптимизация в даном запросе отсутствует впринцыпе

вобщем тут не все так просто..
попробую более точно описать.

Код
CREATE TABLE `CFC_1181748791` (
  `id` int(11) NOT NULL auto_increment,
  `Complex` text NOT NULL,
  `Section` text NOT NULL,
  `apNo` text NOT NULL,
  `Rooms` text NOT NULL,
  `Floor` text NOT NULL,
  `Area` text NOT NULL,
  `Totalarea` text NOT NULL,
  `PriceEURO` text NOT NULL,
  `Description` text NOT NULL,
  `View` text NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=143;

--
-- Дамп данных таблицы `CFC_1181748791`
--

INSERT INTO `CFC_1181748791` VALUES (1, 'Complex', 'Section', 'ap.No', 'Rooms', 'Floor', 'Area', 'Total area', 'Price EURO', 'Description', 'View');
INSERT INTO `CFC_1181748791` VALUES (2, 'Crown Fort Club', 'A-1', '1', '2', '0', '60.98', '0', '81652.22', 'living room,kitchen box,WC/bathroom,bedroom,hall,terrace', 'sea/garden');
INSERT INTO `CFC_1181748791` VALUES (3, 'Crown Fort Club', 'A-1', '9', '2', '2', '65.230000000000000000', '5', '87342.97', 'living room,kitchen box,WC/bathroom,bedroom,hall,terrace', 'sea/garden');
INSERT INTO `CFC_1181748791` VALUES (4, 'Crown Fort Club', 'A-1', '19', '3', '6', '86.81', '5', '129650.74', '', 'sea');
INSERT INTO `CFC_1181748791` VALUES (5, 'Crown Fort Club', 'A-2', '24', '3', '1', '64.05', '75.56', '85762.95', 'kitchen box,WC/bathroom,2 bedrooms,hall,2 terraces', 'sea/garden');
INSERT INTO `CFC_1181748791` VALUES (6, 'Crown Fort Club', 'A-2', '27', '2', '2', '64.05', '75.56', '85762.95', 'living room,kitchen box,WC/bathroom,bedroom,hall,terrace', 'sea/garden');


вот пример таблицы..
дело в том что эта таблица создается при экспорте файла excel в MySQL
поэтому поля там могут быть совершенно разные..
но первая таблица и вторая которую нужно сравнить... по полям одинаковы.. так как этот excel файл присылают с изменениями.. и там может нехватать строки.. или какие-то цифры поменяны в столбце...
вот хотелось бы найти эти измененые цифры и недостающие строки..

Спустя 5 минут, 11 секунд (14.06.2007 - 13:05) Ghost написал(а):
если поле ид будет везде, то имена остальных полей можно вытянуть, и формировать запрос динамически,
если ид не будет где-нить, то нет

Спустя 15 минут, 40 секунд (14.06.2007 - 13:20) кекс написал(а):
Цитата(Ghost @ 14.6.2007, 14:05) [snapback]22695[/snapback]
если поле ид будет везде, то имена остальных полей можно вытянуть, и формировать запрос динамически,
если ид не будет где-нить, то нет


поле id будет везде.. но при экспорте второго файла с изменениями может быть убрана одна строка.. и в таблице id сместятся на одну цифру
тоесть смысла-то особого в этих id как бы и нет... или всетаки есть?

Спустя 32 минуты, 11 секунд (14.06.2007 - 13:52) Ghost написал(а):
если по ним задается соответствие, то имеет,
если ид просто так для понту, то запрос вообще никакого смысла не имеет

Спустя 9 минут, 25 секунд (14.06.2007 - 14:02) кекс написал(а):
Цитата(Ghost @ 14.6.2007, 14:52) [snapback]22710[/snapback]
если по ним задается соответствие, то имеет,
если ид просто так для понту, то запрос вообще никакого смысла не имеет


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

Спустя 52 минуты, 21 секунда (14.06.2007 - 14:54) Ghost написал(а):
ок, тогда можно так

select str, count(*) as co from
(select сюда пихаем конкат всех полей через разделитель какой-нибудь AS str from tab1
union
select аналогично AS str2 from tab2) as tmp
group by str
having co=1

Спустя 8 минут, 3 секунды (14.06.2007 - 15:02) zaxar написал(а):
Запрос

SELECT table1.* FROM table1 LEFT JOIN table2 ON table1.id=table2.id WHERE table2.id IS NULL

выведет записи из table1, которых нет в table2

Единственный минус — проверка несоответствия в данном запросе идет только по полю id (table1.id=table2.id WHERE table2.id

Как сделать проверку сразу по всем полям — не знаю. Либо углубляться в JOIN-запросы, либо посылать эти запросы по очереди, меняя название поля. Не могу помочь.

Спустя 2 часа, 30 минут, 30 секунд (14.06.2007 - 17:33) кекс написал(а):
Ghost спасибо. сработала такая схема.. сейчас ее проверю в обе стороны...

SELECT str, count(*) as co FROM
(select CONCAT(Complex) AS str FROM $t1
union
SELECT CONCAT(Complex) AS str2 FROM $t2) AS tmp
group by str
having co=1

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




zaxar
не.. это сразу видно что не прокатит... тут ID... а если одной строки не хватает, то ID смещается и все что после удаленной строки не прокатывает..

Спустя 17 минут, 48 секунд (14.06.2007 - 17:51) Ghost написал(а):
что такое в товоем случае complex?
имелось ввиду нечто вроде name, '!!!', street, '!!!', phone, '!!!', chto-to 1, '!!!'
где '!!!' - спец разделитель, чтоб столбцы не накладывались
напр
22, 3 и
2, 23

Спустя 40 минут, 25 секунд (14.06.2007 - 18:31) кекс написал(а):
Ghost , точно.. чет я уже глаз замылил до такой степени.. сейчас попробую..

Спустя 4 минуты, 11 секунд (14.06.2007 - 18:35) кекс написал(а):
SELECT str, count(*) as co FROM
(select CONCAT(`Complex`, `Section`, `apNo`, `Rooms`, `Floor`, `Area`, `Totalarea`, `PriceEURO`, `Description`, `View`) AS str FROM $tab1
union
SELECT CONCAT(`Complex`, `Section`, `apNo`, `Rooms`, `Floor`, `Area`, `Totalarea`, `PriceEURO`, `Description`, `View`) AS str2 FROM $tab2) AS tmp
group by str
having co=1
") or die(mysql_error()); //
while ($row = mysql_fetch_array ($res)) {
echo $row["str"]."<br>";
}


`Complex`, `Section`, `apNo`, `Rooms`, `Floor`, `Area`, `Totalarea`, `PriceEURO`, `Description`, `View`

это поля таблицы

Спустя 45 секунд (14.06.2007 - 18:36) кекс написал(а):
выводит все строки..

Спустя 2 минуты, 47 секунд (14.06.2007 - 18:39) Ghost написал(а):
AS str2 лишнее
или поставить AS str, не помню точно

Спустя 10 минут, 13 секунд (14.06.2007 - 18:49) Ghost написал(а):
а, не, ни в этом трабла,
UNION ALL

мануал рулит smile.gif

Спустя 17 секунд (14.06.2007 - 18:49) кекс написал(а):
решил по другому сделать... считать файл построчно в базу и сравнивать один столбец.. так проще

SELECT tab1.txt
FROM tab1
LEFT JOIN tab2
ON tab1.txt = tab2.txt
WHERE tab2.txt IS NULL

и второй запрос зеркальный

SELECT tab2.txt
FROM tab2
LEFT JOIN tab1
ON tab2.txt = tab1.txt
WHERE tab1.txt IS NULL

во всяком случае по вставлению руками в базу все работает.. без ID и всего такого.. сейчас найду какой-нить скрипт который считает построчно.. и пишет в базу.. сам я excel фиг разберуsmile.gif
все равно спасибо за помощь

Спустя 4 минуты, 21 секунда (14.06.2007 - 18:54) Ghost написал(а):
попробуй поставить all
спецом пришлось сделать таблицу, но все отработало чисто smile.gif

Спустя 1 минута, 59 секунд (14.06.2007 - 18:56) кекс написал(а):
UNION ALL выдает похожее что-то на правду.. только в куче все получается как-то....sad.gif а в предыдущем видно в какой таблице что не соответствует.. да и id все равно придется прикручивать, так как номер строки видно будет что бы долго не искать...
а в твоем примере попробовать надо ай ди-то.. хе.. получается.. ну сейчас попробую с новым файлом где еще никаких изменений не делал.. жаль что только все сплошняком выводит... хоть бы пробелы как сделатьsmile.gif

Спустя 2 минуты, 29 секунд (14.06.2007 - 18:58) Ghost написал(а):
explode
только разделитель выбрать надо такой чтоб в полях небыло, напр не !!!, а <!$!>
а ид туда добавить уж совсем просто smile.gif
сам давай)
а задачка красивая smile.gif

Спустя 2 минуты, 33 секунды (14.06.2007 - 19:01) кекс написал(а):
да работает и твоя схемаsmile.gif спасибо.. только вот блин ячейки не разделяет.. а как в таком запросе их разделить я представления не имею...

Спустя 7 минут, 18 секунд (14.06.2007 - 19:08) кекс написал(а):
или надо при експорте перед каждым полем вписывать что-то что бы потом это сделать в качестве разделителя.. или фик знает..

Спустя 1 минута, 6 секунд (14.06.2007 - 19:09) кекс написал(а):
Цитата(Ghost @ 14.6.2007, 19:58) [snapback]22783[/snapback]
а задачка красивая smile.gif

в смысле которая?smile.gif explode ?smile.gif

Спустя 1 минута, 38 секунд (14.06.2007 - 19:11) Ghost написал(а):
дык блин, есть жеж уже разделитель.
а, ты его не добавил, говорили жеж
CONCAT(`Complex`, '<!$!>',`Section`, '<!$!>', `apNo`, '<!$!>',...)
а потом explode

Спустя 8 минут, 35 секунд (14.06.2007 - 19:19) кекс написал(а):
может не explode всетаки? а то он в массив загоняет.. а replace ?

Спустя 2 минуты, 38 секунд (14.06.2007 - 19:22) Ghost написал(а):
это уж сам смотри как тебе надо дальше по коду smile.gif
если че-то менять в базе - имеет смысл разбить в массив
если дак - для информирования - то в качестве разделителя возьми 4 пробела и будет тебе щастье smile.gif

про id повторюсь - это сделать можно и довольно просто, так что думай сам smile.gif
а мне ваще давно домой пора smile.gif

Спустя 6 минут (14.06.2007 - 19:28) кекс написал(а):
спасибоsmile.gif ID я сделал.. а дальше ничего не надо с этим иметь.. просто девочка посмотрит увидит в каких строках изменения и исодя из этого сделает что надо.. просто им там сидеть полдня париться искать где изменения..
завтра вкину урл на рабочий фигнюшку.. посмотришь сам как работаетsmile.gif

Спустя 2 года, 11 месяцев, 9 дней, 1 час, 8 минут, 24 секунды (23.05.2010 - 20:36) IPnex написал(а):
У меня малость другой вопрос. Есть таблица price с прайсом, в ней около 17500 записей.
При загрузке эксель файла из него в новую таблицу price_upd загружается новый прайс из файла.
Собственно вопрос, как сравнить тиблицы price и price_upd так, чтобы если цена у артикула из таблицы price отличается от цены этого же артикула из таблицы price_upd, то цена в таблице price обновлялась на цену из таблицы price_upd

Спустя 4 минуты, 36 секунд (23.05.2010 - 20:41) waldicom написал(а):
Т.е. не стоит условие больше-меньше, а просто надо заменять цены?
Тогда можно попросту заменить все цены, потому что если цена разная, то она обновится, а если одинаковые, то ничего не изменится.

Спустя 8 минут, 25 секунд (23.05.2010 - 20:49) IPnex написал(а):
ну условие только одно, что если цены равны, то ничего не делать. Иначе обновить на новую.
Пробовал так:
$sql = mysql_query("SELECT * FROM price_upd");
for($i=0; $row=mysql_fetch_array($sql); $i++)
{
$sql2 = mysql_query("UPDATE price SET price='$row[price]' WHERE art='$row[art]' AND price!='$row[price]'");
}

Но обновление происходит не до конца, т.е. не вся таблица обновляется. Видимо не хватает аптайма. Как еще можно делать, чтобы шустрее обновлялось?

Спустя 4 минуты, 31 секунда (23.05.2010 - 20:54) IPnex написал(а):
А можете подсказать пожалуйста как лучше сделать!

Спустя 1 минута, 4 секунды (23.05.2010 - 20:55) waldicom написал(а):
Не, так не надо. Надо в одном запросе.
Типа

UPDATE `price`,`price_upd` SET `price`.`price`= `price_upd`.`price` WHERE `price`.`articleId`= `price_upd`.`articleId`


articleId - это поле, по которму связываются таблицы.

Спустя 6 минут, 38 секунд (23.05.2010 - 21:01) IPnex написал(а):
вобщем попробовал, вроде работает, но очень долго обновляет, секунд 15. А можно как-нибудь ускорить сей процесс?

Спустя 1 минута, 13 секунд (23.05.2010 - 21:03) waldicom написал(а):
Цитата (IPnex @ 23.05.2010 - 20:01)
вобщем попробовал, вроде работает, но очень долго обновляет, секунд 15. А можно как-нибудь ускорить сей процесс?

Конечно. Можно расставить правильно индексы, можно брать только те записи, которые отличаются друг от друга...
Если Вы добавите один символ в запрос выше, от он, скорее всего, будет выполняться быстрее.

Спустя 4 минуты, 43 секунды (23.05.2010 - 21:07) IPnex написал(а):
а можно чуть подробнее про индексы, в смысле на какие поля ставить?
А по поводу того, чтобы брать только те записи, которые отличаются, это сложновато, т.к. могут измениться например только 7 цен, а может 7000 цен у товаров.
И про какой символ Вы говорите?

Спустя 1 час, 43 минуты, 59 секунд (23.05.2010 - 22:51) waldicom написал(а):
Цитата (IPnex @ 23.05.2010 - 20:07)
а можно чуть подробнее про индексы, в смысле на какие поля ставить?

Так как мы делаем слияние таблиц по полю articleId, то как минимум на это поле (конечно замените это поле тем, которое используете Вы).


Цитата (IPnex @ 23.05.2010 - 20:07)
И про какой символ Вы говорите?

Надо подумать. В смысле Вам надо подумать.

Спустя 4 минуты, 30 секунд (23.05.2010 - 22:56) IPnex написал(а):
попробовал обновить еще пару раз, теперь ничего не происходит. Ждал около минуты и ничего. Мне кажется это из-за большого количества записей

Спустя 1 день, 12 часов, 26 минут, 38 секунд (25.05.2010 - 11:23) IPnex написал(а):
Помогите кто-нибудь пожалуйста! Еще раз повторю задачу:

Есть таблица price с прайсом, в ней около 17500 записей.
При загрузке эксель файла из него в новую таблицу price_upd загружается новый прайс из файла.
Собственно вопрос, как сравнить тиблицы price и price_upd так, чтобы если цена у артикула из таблицы price отличается от цены этого же артикула из таблицы price_upd, то цена в таблице price обновлялась на цену из таблицы price_upd

Спустя 1 день, 43 минуты, 33 секунды (26.05.2010 - 12:06) IPnex написал(а):
Можете тогда ответить на вопрос, как увеличить время, которое отводится на операции с таблицей. В моем случае на обновление. Просто если увеличить это время, то можно будет без проблем обновить тем запросом, который есть сейчас.

Спустя 11 минут, 9 секунд (26.05.2010 - 12:17) Rand написал(а):
с разделителем это CONCAT_WS
CONCAT_WS(',' Complex, Section, apNo, Rooms, Floor, Area, Totalarea, PriceEURO, Description, View)


P.S: Блин, я некропостер. Забыл страницы полистать ))
Почему нельзя удалять свои сообщения, если они последние в теме?

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

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

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

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

Подскажите в какую сторону копать

Начала со сравнения таблиц. Ищем строчку из первой таблицы, который не во второй и выводим ее. Как место вывода строки поместить ее на первое место таблицы

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>";
}


Так не работает, выдает ошибку в первой строке: Parse error: syntax error, unexpected T_STRING

Как исправить?

Спустя 1 час, 54 минуты, 11 секунд (4.06.2010 - 19:43) twin написал(а):
Начать нужно с того, что поместить вопрос в отдельную тему.
С удовольствием помогу, особенно в этом.
Сформулируйте вопрос для названия темы, я перенесу.

Спустя 14 минут, 52 секунды (4.06.2010 - 19:58) Jule4ka написал(а):
Давайте перенесем

Название темы "Синхронизация двух таблиц"

Спасибо за помощь


_____________
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.