|
|
|
| Здравствуйте.
помогите решить задачу.
собственно есть 2 таблицы, нужно создать запрос так, что бы вывести результат несоответствия. возможно изменение в строке.
возможно и отсутствие строки...
с трудом представляю себе как вобще такое можно реализовать...
если бы там были id строки то строки еще сверить можно на несоответствие как-то.. но когда нет id да и некоторых строк может совсем не быть...
помогите пожалуйста. | |
|
|
|
|
|
|
|
для: кекс
(14.06.2007 в 11:52)
| | если в таблицах нет первичных ключей - их не сравнивать надо, а перепроектировать. | |
|
|
|
|
|
|
|
для: 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? | |
|
|
|
|
|
|
|
для: кекс
(14.06.2007 в 12:25)
| | Вы бы написали, что хранят эти таблицы...
Есть в принципе совокупность ключей, уникально определяющая любую строку?
Если это телефонная база, этот ключ - телефонный номер.
Если паспортная - номер паспорта
Если база людей - адрес прописки, ФИО, дата рождения.
Если база заказов - номер контракта.
Если это таблица, хранящая абы что - в шредер такую таблицу.
Естественно, если суррогатные ключи приделываются к двум копиям таблицы уже после рассинхронизации - толку от них немного. | |
|
|
|
|
|
|
|
для: 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
ну плюс еще строк ццать....
ну и собственно я нашел утилитку которая загоняет это в базу данных..
создать ключи, ну смысла в них нет.. если в следущем файле который они пришлют не будет пары строк.. ключи просто сдвинутся... | |
|
|
|
|
|
|
|
для: кекс
(14.06.2007 в 13:43)
| | Ну тогда нужно говориить с Вашей супругой :)) Она вероятно , знает, что означает каждая из колонок, и какие колонки в совокупноси пригодны для идентификации объекта.
Далее я бы предложил следующее решение.
Ключ, построенный на выбранных колонках строки excel занести в таблицу ключей, получив id объекта. использовать этот id в качестве ключа для занесения новых строк в таблицу.
строки с повторяющимися ключами относить к одному объекту (выкидывать повторы если того требует логика)
Можно прохешировать ключ (или даже всю строку), чтобы уменьшить его физический размер, но это потенциальный источник коллизий. | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 14:13)
| | говорить с ней смысла нет... мне нужен универсальный скрипт.. который сравнит два практически одинаковых файла excel но в одном из них в какой-то строке будут изменены данные.. например вместо 150 стоять 140
или же совсем удалена одна строка... все.. ну или 5 строк.. или 7.. может 20 строк удалено.. а может и удалено 3 строки и в 5 внесены изменения...
вот пример.. у вас дома есть excel файл в котором вы ведете покупки.. например...
ну и кто-то из детей залез в него и внес изменения.. типа поумничал.. вы недовольны но у вас есть предыдущий файл где нет изменений в данных.. ну вы и сравниваете старый файл и новый.. а там выдает.. колбаса вместо 50 рублей стоит 1500.. а так сидеть и пялиться то в один то в другой файл что бы найти эти 50 и 1500 можно и весь день... | |
|
|
|
|
|
|
|
для: кекс
(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
|
д) долго рассматривать полученные несовпадения | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: кекс
(14.06.2007 в 17:31)
| | как выглядит запрос?
Какая версия sql-сервера? | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: кекс
(14.06.2007 в 17:56)
| | минуту... mysql и вправду похоже outer join не понимает...
попробуйте заменить на left join
и выполнить сравнение дважды - первую со второй, а потом вторую с первой. | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 17:58)
| | что значит дважды? | |
|
|
|
|
|
|
|
для: кекс
(14.06.2007 в 18:06)
| | первый запрос выяснит, какие строки исчезли.
второй - какие добавились. | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 17:58)
| | два запроса сделать? | |
|
|
|
|
|
|
|
для: кекс
(14.06.2007 в 18:07)
| | два. | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 18:10)
| | счас попробую с двумя запросами... | |
|
|
|
|
|
|
|
для: 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
вот запрос.. ничего не выводит... | |
|
|
|
|
|
|
|
для: кекс
(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 не нужны | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 18:52)
| | :) блин! я тут уже запутался:) сейчас попробую.. | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 18:52)
| | C огромной благодарностью за мысль сделать построчно... иначе бы я с ячейками этими намучался.. сейчас в базу ручками вписал строки.. пока работает.. сейчас еще буду тестировать..
теперь осталось придумать как загнать только строки из excel файла в базу без конвертирования в другой формат. | |
|
|
|
|
|
|
|
для: кекс
(14.06.2007 в 19:22)
| | если через csv ничего не теряется - лучше не рисковать и пользоваться им. | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 19:24)
| | ну вобщем сейчас буду пробовать..
попробую и простой эксель и после экспорта.. что получаться будет на том и остановлюсь
просто есть парсер excel файла.. а как csv я просто не в курсе, искать что-то надо.. хотя в интернете полно всего.
еще раз спасибо. | |
|
|
|
|
|
|
|
для: кекс
(14.06.2007 в 19:39)
| | fgetcsv() - стандартная функция. | |
|
|
|
|
|
|
|
для: Trianon
(14.06.2007 в 19:40)
| | ниразу не использовал.. спасибо попробую:) | |
|
|
|
|
|
|
|
для: кекс
(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:25)
| | не, это немного не то... | |
|
|
|