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

Форум MySQL

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

 

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

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

тема: Вывести совпадающие по нескольким полям строки из двух таблиц
 
 автор: DDK   (24.08.2008 в 22:28)   письмо автору
 
 

Господа!

Подскажите, пожалуйста: есть две таблицы абсолютно идентичной структуры, колонки все одинаковые. Нужно вывести запросом из первой таблицы все записи, идентичные записям во второй таблице. Идентичнойсть проверяется по строгому соответствию (1==1) информации в нескольких полях этих записей. Т.е. что-то типа where table1.col1=table2.col1 AND table1.col2=table2.col2 AND table1.col3=table2.col3

Как это сделать наиболее оптимально?

  Ответить  
 
 автор: Trianon   (24.08.2008 в 22:58)   письмо автору
 
   для: DDK   (24.08.2008 в 22:28)
 

Первичные ключи у таблиц есть?
И есть ли столбцы с пустыми (NULL) значениями?

  Ответить  
 
 автор: DDK   (24.08.2008 в 23:07)   письмо автору
 
   для: Trianon   (24.08.2008 в 22:58)
 

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

  Ответить  
 
 автор: Trianon   (24.08.2008 в 23:12)   письмо автору
 
   для: DDK   (24.08.2008 в 23:07)
 

Если это разовая акция , то с чем связан вопрос?
Запрос в лоб слишком долго выполняется?

  Ответить  
 
 автор: DDK   (24.08.2008 в 23:51)   письмо автору
 
   для: Trianon   (24.08.2008 в 23:12)
 


SELECT bg.* FROM tmp_big bg, tmp_small sm 
WHERE bg.col1=sm.col1 AND bg.col2=sm.col2 AND bg.col3=sm.col3

Так ?

(Честно говоря, не уверен был в правильности данной конструкции и попутно хотел ещё примеры увидеть)

  Ответить  
 
 автор: Trianon   (25.08.2008 в 01:01)   письмо автору
 
   для: DDK   (24.08.2008 в 23:51)
 

так.

  Ответить  
 
 автор: BinLaden   (25.08.2008 в 01:30)   письмо автору
 
   для: DDK   (24.08.2008 в 23:51)
 

Можно узнать - это только на один раз или планируете в скрипте на постоянной основе использовать? Если да, то почему именно так?

  Ответить  
 
 автор: DDK   (25.08.2008 в 02:12)   письмо автору
 
   для: BinLaden   (25.08.2008 в 01:30)
 

1) Задача скрипта - разовое вполнение задачи.
2) потом что не знаю, как по-другому :))

  Ответить  
 
 автор: BinLaden   (25.08.2008 в 02:32)   письмо автору
 
   для: DDK   (25.08.2008 в 02:12)
 

> потом что не знаю, как по-другому

А какую цель преследуете? Такое ощущение, что Вам нужно просто добавить допольнительный столбец.

  Ответить  
 
 автор: DDK   (25.08.2008 в 02:43)   письмо автору
 
   для: BinLaden   (25.08.2008 в 02:32)
 

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

  Ответить  
 
 автор: BinLaden   (25.08.2008 в 02:47)   письмо автору
 
   для: DDK   (25.08.2008 в 02:43)
 

Не хотите говорить значит. Ну ладно.

  Ответить  
 
 автор: DDK   (25.08.2008 в 04:45)   письмо автору
 
   для: BinLaden   (25.08.2008 в 02:47)
 

Да для работы просто надо - сверять отчёты, чтобы дочерние компании не наё***ли :))) Ну зачем вдаваься в подробности... простая автоматизация ручного труда!

  Ответить  
 
 автор: BinLaden   (25.08.2008 в 11:27)   письмо автору
 
   для: DDK   (25.08.2008 в 04:45)
 

А почему бы не ввести дополонительный столбец для идентификатора дочерней компании?

  Ответить  
 
 автор: DDK   (25.08.2008 в 12:09)   письмо автору
 
   для: BinLaden   (25.08.2008 в 11:27)
 

Потому что оно не нужно :) Скрипт удет работать в виде сервиса - зашёл, загрузил файл1 и файл2 (в оригинале они в DBF, перегоняются в mysql для удобства и скорости работы, т.к. записей в бОльшей базе очень много), нажал кнопочку - получил мгновенно результат - распечатал и доволен :)

  Ответить  
 
 автор: Trianon   (25.08.2008 в 12:12)   письмо автору
 
   для: DDK   (25.08.2008 в 12:09)
 

Они оба в DBF?
Если большая база своя - зачем её каждый раз гонять из dbf в sql?

  Ответить  
 
 автор: DDK   (25.08.2008 в 12:39)   письмо автору
 
   для: Trianon   (25.08.2008 в 12:12)
 

Потому что у PHP'шного расширения для работы с DBF очень убогий набор функций, позволяющий разве что выбирать из БД записи перебором по порядку, либо по номеру конкретной записи. Соответственно делать поиск одинаковых записей в двух базах - это как ни крути цикл на 1500 записей внутри цикла на 8000 записей, ибо никаким языком запросов там и не пахнет... it's terrible!

  Ответить  
 
 автор: Trianon   (25.08.2008 в 12:42)   письмо автору
 
   для: DDK   (25.08.2008 в 12:39)
 

Это понятно, я о другом.
Меняется, как я понял, только чужой DBF. Почему нельзя оставить sql-копию своего (большого) файла до следующего раза?

  Ответить  
 
 автор: DDK   (25.08.2008 в 12:44)   письмо автору
 
   для: Trianon   (25.08.2008 в 12:42)
 

Так она и стаётся :) Просто в самом начале скрипта делается TRUNCATE TABLE обеим временным таблицам. Накапливать данные - такой задачи не стоит.

  Ответить  
 
 автор: Trianon   (25.08.2008 в 12:49)   письмо автору
 
   для: DDK   (25.08.2008 в 12:44)
 

В своей копии можно было бы создать столбик с хешем чувствительных полей и проиндексировать его.
Аналогичный индекс строкить при конвертированиикороткого dbf.
Тогда не исключено, что поиск совпадений можно было бы ускорить.

Конечно, если данные не сохраняются, овчинка выделки не стоит.

  Ответить  
Rambler's Top100
вверх

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