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

Форум MySQL

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

 

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

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

тема: Вывод измененых данных по 2-м таблицам
 
 автор: brokonyer   (08.03.2010 в 23:42)   письмо автору
 
 

Доброго времени суток!

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

Есть 2 таблицы примерно с такими параметрами

TABLE
- id
- name
- pID
- hidden
- count
- added


TABLE2
- id
- name
- pID
- hidden
- count


Требуется вывести те строки из TABLE2 которых нету в таблице TABLE и те строки у которого id совпадает а name либо pID нет.

  Ответить  
 
 автор: exp   (09.03.2010 в 00:05)   письмо автору
 
   для: brokonyer   (08.03.2010 в 23:42)
 

второе условие ещё можно себе представить каким-нибудь
TABLE.id = TABLE2.id AND ( TABLE.pID != TABLE2.pID OR TABLE.name != TABLE2.name)
а вот
> те строки из TABLE2 которых нету в таблице TABLE
что имеется ввиду под словом строки ?

  Ответить  
 
 автор: brokonyer   (09.03.2010 в 00:13)   письмо автору
 
   для: exp   (09.03.2010 в 00:05)
 


TABLE
id  | name  | pID | hidden | count | added
_______________________________________________
 1  |  nm1  | 3   |  0     |  0    | 12.12.2009
 2  |  nm2  | 6   |  0     |  0    | 12.12.2009
 3  |  nm32 | 5   |  0     |  0    | 12.12.2009
 4  |  nm4  | 6   |  0     |  0    | 12.12.2009
 5  |  nm5  | 7   |  0     |  0    | 12.12.2009


TABLE2
id  | name  | pID  | hidden | count 
__________________________________
 1  |  nm1  |  3   |  0     |  0   
 2  |  nm2  |  4   |  0     |  0  
 3  |  nm3  |  5   |  0     |  0   
 4  |  nm4  |  6   |  0     |  0   
 5  |  nm5  |  7   |  0     |  0   
 6  |  nm6  |  5   |  0     |  0   
 7  |  nm7  |  6   |  0     |  0   
 8  |  nm8  |  7   |  0     |  0  



Результат будет строки под номером 2,3,6,7,8 из TABLE2

SELECT TABLE2.* FROM TABLE2 RIGHT JOIN TABLE ON TABLE2.id = TABLE.id AND TABLE2.name = TABLE.name AND TABLE2.pID = TABLE.pID


показывает мне в точ обратные строки, те которые совпадают, а мне нужны те которые не совпадают, что то я торможу...

  Ответить  
 
 автор: exp   (09.03.2010 в 00:53)   письмо автору
 
   для: brokonyer   (09.03.2010 в 00:13)
 

что-то такое наверное
CREATE TABLE t1 (
  id tinyint NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  pID tinyint NOT NULL,
  hidden tinyint NOT NULL,
  `count` tinyint NOT NULL,
  added DATE NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO t1 VALUES
 (NULL,  'nm1', 3,  0, 0,  0),
 (NULL,  'nm2', 6,  0, 0,  0),
 (NULL,  'nm32', 5, 0, 0,  0),
 (NULL,  'nm4', 6,  0, 0,  0),
 (NULL,  'nm5', 7,  0, 0,  0);
SELECT * FROM t1 t;

CREATE TABLE t2 (
  id tinyint NOT NULL AUTO_INCREMENT,
  `name` varchar(25) NOT NULL,
  pID tinyint NOT NULL,
  hidden tinyint NOT NULL,
  `count` tinyint NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO t2 VALUES
 (NULL,  'nm1', 3,  0, 0),
 (NULL,  'nm2', 4,  0, 0),
 (NULL,  'nm3', 5,  0, 0),
 (NULL,  'nm4', 6,  0, 0),
 (NULL,  'nm5', 7,  0, 0),
 (NULL,  'nm6', 5,  0, 0),
 (NULL,  'nm7', 6,  0, 0),
 (NULL,  'nm8', 7,  0, 0);
SELECT * FROM t2;

SELECT t2.* FROM t2 LEFT JOIN t1
 USING(id)
 WHERE IFNULL((t2.pID != t1.pID OR t2.name != t1.name), 1);

  Ответить  
 
 автор: brokonyer   (09.03.2010 в 01:04)   письмо автору
 
   для: exp   (09.03.2010 в 00:53)
 

Спасибо, именно то что надо. оператором IFNULL я еще не пользовался. Интересно, каким нибудь другим способом возможно будет решить эту задачу или нет. Просто хотелось бы узнать

  Ответить  
 
 автор: devart   (09.03.2010 в 12:21)   письмо автору
 
   для: brokonyer   (09.03.2010 в 01:04)
 

Можно воспользоваться визуальным инструментом сравнения данных, который доступен в dbForge Studio for MySQL v4.00. Инструмент русифицирован и бесплатен.

  Ответить  
 
 автор: brokonyer   (30.03.2010 в 06:21)   письмо автору
 
   для: devart   (09.03.2010 в 12:21)
 

Думаю для веб приложении это не сгодится, пригоден только для самого разработчика...

  Ответить  
 
 автор: brokonyer   (30.03.2010 в 06:12)   письмо автору
 
   для: exp   (09.03.2010 в 00:53)
 

При больших количеств строк в обоих баз БД не выполняет запрос и толи зависает толи обрывается связь, толи он сервере его выполняет очень долго и просто сбрасывает web подключение... Как можно с этим боротся? Число строк в обоих Таблицах превышает 10000. Но думаю такая количество не должно быть помехой для Mysql

  Ответить  
 
 автор: Trianon   (30.03.2010 в 13:03)   письмо автору
 
   для: brokonyer   (30.03.2010 в 06:12)
 

Это если бы в одной таблице.
А две таблицы без прямой связи по индексу создают декартово произведение - более сотни миллионов строк, которые нужно пропустить через фильтр.

Кстати, как у Вас десять тысяч строк вмещается в TINYINT?

  Ответить  
 
 автор: brokonyer   (31.03.2010 в 01:06)   письмо автору
 
   для: Trianon   (30.03.2010 в 13:03)
 

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


Если поместить эти 10000 строк в одну Таблицу (итого 20000 строк в таблице будет), только добавив параметр с помощью которого можно разделить их по запросам, эффект от этого будет?

  Ответить  
 
 автор: Trianon   (31.03.2010 в 01:17)   письмо автору
 
   для: brokonyer   (31.03.2010 в 01:06)
 

Если этот признак хранить в виде (1/2/3 === first/second|/both) , иными словами, если в такой таблице строка, принадлежащая обеим наборам, всё же будет проявлена один раз (с признаком both), а не два (c признаками first и second) - эффект будет.

  Ответить  
 
 автор: brokonyer   (31.03.2010 в 07:03)   письмо автору
 
   для: Trianon   (31.03.2010 в 01:17)
 

Я не очень то понял в чем фишка и для чего first, second, both? Если это обозначает принадлежность к первому и к второму таблицу а both есть совпадающие строки, тогда мне еще придется добавить еще один этап где их надо сравнить и по результатам присвоить both.

  Ответить  
 
 автор: Trianon   (31.03.2010 в 09:00)   письмо автору
 
   для: brokonyer   (31.03.2010 в 07:03)
 

> Если это обозначает принадлежность к первому и к второму таблицу а both есть совпадающие строки,

да. именно так.

>тогда мне еще придется добавить еще один этап где их надо сравнить и по результатам присвоить both.

Собственно, это делается на этапе добавления строк. С помощью конструкции ON DUPLICATE KEY UPDATE
Зато операция разовая, и куда менее затратная, чем предыдущая, т.к. сравнение происходит по уникальному индексу.

  Ответить  
 
 автор: brokonyer   (31.03.2010 в 11:22)   письмо автору
 
   для: Trianon   (31.03.2010 в 09:00)
 

Да. но тут не только ID играет роли но и NAME тоже, если даже ID совпадает NAME может и не совпадать, в этот момент нужно сохранить обе версии параметра NAME.

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

  Ответить  
 
 автор: Trianon   (31.03.2010 в 18:08)   письмо автору
 
   для: brokonyer   (31.03.2010 в 11:22)
 

Видимо тогда придется ввести столбик name2 или как-то так.

  Ответить  
 
 автор: brokonyer   (02.04.2010 в 08:38)   письмо автору
 
   для: Trianon   (31.03.2010 в 18:08)
 

Ясно, Спасибо.

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

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