Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: сравнение двух таблиц MySQL
 
 автор: кекс   (14.06.2007 в 11:52)   письмо автору
 
 

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

   
 
 автор: Trianon   (14.06.2007 в 12:02)   письмо автору
 
   для: кекс   (14.06.2007 в 11:52)
 

если в таблицах нет первичных ключей - их не сравнивать надо, а перепроектировать.

   
 
 автор: кекс   (14.06.2007 в 12:25)   письмо автору
 
   для: Trianon   (14.06.2007 в 12:02)
 

ну хорошо.. первичные ключи создать можно при создании таблицы.. но если во второй таблице будет отсутствовать строка, то и ключ сдвинется на один..
| 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 |

вот собственно пример двух таблиц.. в одной отсутствуе 3 строка
и в 5 есть другое значение в phone но во второй создаваемой таблице id его уже будет 4
как вот это реализовать средствами MySQL?

   
 
 автор: Trianon   (14.06.2007 в 12:59)   письмо автору
 
   для: кекс   (14.06.2007 в 12:25)
 

Вы бы написали, что хранят эти таблицы...
Есть в принципе совокупность ключей, уникально определяющая любую строку?
Если это телефонная база, этот ключ - телефонный номер.
Если паспортная - номер паспорта
Если база людей - адрес прописки, ФИО, дата рождения.
Если база заказов - номер контракта.

Если это таблица, хранящая абы что - в шредер такую таблицу.

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

   
 
 автор: кекс   (14.06.2007 в 13:43)   письмо автору
 
   для: Trianon   (14.06.2007 в 12:59)
 

тут дело вот в чем, у жены работа связана с недвижимостью им одна контора присылает excel файлы в которых есть данные вот примерно такого плана:
Complex Section ap.No Rooms Floor Area Total area Price EURO Description View
Crown Fort Club A-1 1 2 0 60,98 100 81652,22 living room,kitchen box,WC/bathroom,bedroom,hall,terrace sea/garden
Crown Fort Club A-1 9 2 2 65,23 5 87342,97 living room,kitchen box,WC/bathroom,bedroom,hall,terrace sea/garden
Crown Fort Club A-1 19 3 6 86,81 5 129650,74 sea
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
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

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

   
 
 автор: Trianon   (14.06.2007 в 14:13)   письмо автору
 
   для: кекс   (14.06.2007 в 13:43)
 

Ну тогда нужно говориить с Вашей супругой :)) Она вероятно , знает, что означает каждая из колонок, и какие колонки в совокупноси пригодны для идентификации объекта.

Далее я бы предложил следующее решение.
Ключ, построенный на выбранных колонках строки excel занести в таблицу ключей, получив id объекта. использовать этот id в качестве ключа для занесения новых строк в таблицу.
строки с повторяющимися ключами относить к одному объекту (выкидывать повторы если того требует логика)

Можно прохешировать ключ (или даже всю строку), чтобы уменьшить его физический размер, но это потенциальный источник коллизий.

   
 
 автор: кекс   (14.06.2007 в 14:27)   письмо автору
 
   для: Trianon   (14.06.2007 в 14:13)
 

говорить с ней смысла нет... мне нужен универсальный скрипт.. который сравнит два практически одинаковых файла excel но в одном из них в какой-то строке будут изменены данные.. например вместо 150 стоять 140
или же совсем удалена одна строка... все.. ну или 5 строк.. или 7.. может 20 строк удалено.. а может и удалено 3 строки и в 5 внесены изменения...


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

   
 
 автор: Trianon   (14.06.2007 в 14:38)   письмо автору
 
   для: кекс   (14.06.2007 в 14:27)
 

не надо путать инценденты и нормальную обработку данных.
в Вашем примере - сохраню оба файла в CSV-формат и сравню тексты командой fc /N
и буду ковыряться в отчете пока не восстановлю то, что получится.
В реальной жизни строить обработку данных на таких приниципах, я естественно не буду.

В Вашем случае это примерно эквивалентно тому что
а) создать две таблицы tab1 и tab2 каждую с полями id (auto_increment) и txt
б) загнать все строки первого файла в одну таблицу так, чтобы каждая строка легла в столбец txt.
в) то же самое сделать со вторым файлом.
г)выполнить запрос

SELECT tab1.txt as t1, tab2.txt as t2 
FROM tab1 
     OUTER JOIN tab2 
     ON  tab1.txt = tab2.txt 
  WHERE tab1.id IS NULL 
        OR tab2.id IS NULL 

д) долго рассматривать полученные несовпадения

   
 
 автор: кекс   (14.06.2007 в 17:31)   письмо автору
 
   для: Trianon   (14.06.2007 в 14:38)
 

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 'OUTER JOIN

   
 
 автор: Trianon   (14.06.2007 в 17:50)   письмо автору
 
   для: кекс   (14.06.2007 в 17:31)
 

как выглядит запрос?
Какая версия sql-сервера?

   
 
 автор: кекс   (14.06.2007 в 17:56)   письмо автору
 
   для: Trianon   (14.06.2007 в 17:50)
 

SELECT tab1.Complex as t1, tab2.Complex as t2
FROM tab1
OUTER JOIN tab2
ON tab1.Complex = tab2.Complex
WHERE tab1.id IS NULL
OR tab2.id IS NULL

# ерсия сервера: 5.0.27-standard
# Версия протокола: 10
# Сервер: Localhost via UNIX socket
# Версия MySQL-клиента: 4.1.10

   
 
 автор: Trianon   (14.06.2007 в 17:58)   письмо автору
 
   для: кекс   (14.06.2007 в 17:56)
 

минуту... mysql и вправду похоже outer join не понимает...
попробуйте заменить на left join
и выполнить сравнение дважды - первую со второй, а потом вторую с первой.

   
 
 автор: кекс   (14.06.2007 в 18:06)   письмо автору
 
   для: Trianon   (14.06.2007 в 17:58)
 

что значит дважды?

   
 
 автор: Trianon   (14.06.2007 в 18:12)   письмо автору
 
   для: кекс   (14.06.2007 в 18:06)
 

первый запрос выяснит, какие строки исчезли.
второй - какие добавились.

   
 
 автор: кекс   (14.06.2007 в 18:07)   письмо автору
 
   для: Trianon   (14.06.2007 в 17:58)
 

два запроса сделать?

   
 
 автор: Trianon   (14.06.2007 в 18:10)   письмо автору
 
   для: кекс   (14.06.2007 в 18:07)
 

два.

   
 
 автор: кекс   (14.06.2007 в 18:43)   письмо автору
 
   для: Trianon   (14.06.2007 в 18:10)
 

счас попробую с двумя запросами...

   
 
 автор: кекс   (14.06.2007 в 18:49)   письмо автору
 
   для: Trianon   (14.06.2007 в 18:10)
 

SELECT $tab1.Complex, $tab2.Complex
FROM $tab1
LEFT JOIN $tab2
ON $tab1.Complex = $tab2.Complex
WHERE $tab1.id IS NULL
OR $tab2.id IS NULL

вот запрос.. ничего не выводит...

   
 
 автор: Trianon   (14.06.2007 в 18:52)   письмо автору
 
   для: кекс   (14.06.2007 в 18:49)
 

вот так:


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



тогда даже id's не нужны

   
 
 автор: кекс   (14.06.2007 в 19:13)   письмо автору
 
   для: Trianon   (14.06.2007 в 18:52)
 

:) блин! я тут уже запутался:) сейчас попробую..

   
 
 автор: кекс   (14.06.2007 в 19:22)   письмо автору
 
   для: Trianon   (14.06.2007 в 18:52)
 

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

теперь осталось придумать как загнать только строки из excel файла в базу без конвертирования в другой формат.

   
 
 автор: Trianon   (14.06.2007 в 19:24)   письмо автору
 
   для: кекс   (14.06.2007 в 19:22)
 

если через csv ничего не теряется - лучше не рисковать и пользоваться им.

   
 
 автор: кекс   (14.06.2007 в 19:39)   письмо автору
 
   для: Trianon   (14.06.2007 в 19:24)
 

ну вобщем сейчас буду пробовать..
попробую и простой эксель и после экспорта.. что получаться будет на том и остановлюсь
просто есть парсер excel файла.. а как csv я просто не в курсе, искать что-то надо.. хотя в интернете полно всего.

еще раз спасибо.

   
 
 автор: Trianon   (14.06.2007 в 19:40)   письмо автору
 
   для: кекс   (14.06.2007 в 19:39)
 

fgetcsv() - стандартная функция.

   
 
 автор: кекс   (14.06.2007 в 20:08)   письмо автору
 
   для: Trianon   (14.06.2007 в 19:40)
 

ниразу не использовал.. спасибо попробую:)

   
 
 автор: кекс   (14.06.2007 в 18:25)   письмо автору
 
   для: кекс   (14.06.2007 в 18:07)
 

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

сработало буду окучивать и проверять

   
 
 автор: кекс   (14.06.2007 в 18:38)   письмо автору
 
   для: кекс   (14.06.2007 в 18:25)
 

не, это немного не то...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования