|
|
|
| Доброго времени суток!
Я столкнулся с одной задачей, и не смог решить, хотелось бы узнать реально сделать такую вещь или нет, если да то каким способом?
Есть 2 таблицы примерно с такими параметрами
TABLE
- id
- name
- pID
- hidden
- count
- added
TABLE2
- id
- name
- pID
- hidden
- count
Требуется вывести те строки из TABLE2 которых нету в таблице TABLE и те строки у которого id совпадает а name либо pID нет. | |
|
|
|
|
|
|
|
для: brokonyer
(08.03.2010 в 23:42)
| | второе условие ещё можно себе представить каким-нибудь
TABLE.id = TABLE2.id AND ( TABLE.pID != TABLE2.pID OR TABLE.name != TABLE2.name)
а вот
> те строки из TABLE2 которых нету в таблице TABLE
что имеется ввиду под словом строки ? | |
|
|
|
|
|
|
|
для: 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
|
показывает мне в точ обратные строки, те которые совпадают, а мне нужны те которые не совпадают, что то я торможу... | |
|
|
|
|
|
|
|
для: 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);
|
| |
|
|
|
|
|
|
|
для: exp
(09.03.2010 в 00:53)
| | Спасибо, именно то что надо. оператором IFNULL я еще не пользовался. Интересно, каким нибудь другим способом возможно будет решить эту задачу или нет. Просто хотелось бы узнать | |
|
|
|
|
|
|
|
для: brokonyer
(09.03.2010 в 01:04)
| | Можно воспользоваться визуальным инструментом сравнения данных, который доступен в dbForge Studio for MySQL v4.00. Инструмент русифицирован и бесплатен. | |
|
|
|
|
|
|
|
для: devart
(09.03.2010 в 12:21)
| | Думаю для веб приложении это не сгодится, пригоден только для самого разработчика... | |
|
|
|
|
|
|
|
для: exp
(09.03.2010 в 00:53)
| | При больших количеств строк в обоих баз БД не выполняет запрос и толи зависает толи обрывается связь, толи он сервере его выполняет очень долго и просто сбрасывает web подключение... Как можно с этим боротся? Число строк в обоих Таблицах превышает 10000. Но думаю такая количество не должно быть помехой для Mysql | |
|
|
|
|
|
|
|
для: brokonyer
(30.03.2010 в 06:12)
| | Это если бы в одной таблице.
А две таблицы без прямой связи по индексу создают декартово произведение - более сотни миллионов строк, которые нужно пропустить через фильтр.
Кстати, как у Вас десять тысяч строк вмещается в TINYINT? | |
|
|
|
|
|
|
|
для: Trianon
(30.03.2010 в 13:03)
| | это плохо..
я в первые столкнулся с такой ситуацией, есть ли альтернативная решение этой задачи?
у меня там цифры в INT, а текст VARCHAR
Если поместить эти 10000 строк в одну Таблицу (итого 20000 строк в таблице будет), только добавив параметр с помощью которого можно разделить их по запросам, эффект от этого будет? | |
|
|
|
|
|
|
|
для: brokonyer
(31.03.2010 в 01:06)
| | Если этот признак хранить в виде (1/2/3 === first/second|/both) , иными словами, если в такой таблице строка, принадлежащая обеим наборам, всё же будет проявлена один раз (с признаком both), а не два (c признаками first и second) - эффект будет. | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2010 в 01:17)
| | Я не очень то понял в чем фишка и для чего first, second, both? Если это обозначает принадлежность к первому и к второму таблицу а both есть совпадающие строки, тогда мне еще придется добавить еще один этап где их надо сравнить и по результатам присвоить both. | |
|
|
|
|
|
|
|
для: brokonyer
(31.03.2010 в 07:03)
| | > Если это обозначает принадлежность к первому и к второму таблицу а both есть совпадающие строки,
да. именно так.
>тогда мне еще придется добавить еще один этап где их надо сравнить и по результатам присвоить both.
Собственно, это делается на этапе добавления строк. С помощью конструкции ON DUPLICATE KEY UPDATE
Зато операция разовая, и куда менее затратная, чем предыдущая, т.к. сравнение происходит по уникальному индексу. | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2010 в 09:00)
| | Да. но тут не только ID играет роли но и NAME тоже, если даже ID совпадает NAME может и не совпадать, в этот момент нужно сохранить обе версии параметра NAME.
И задача в том чтобы вывести все не соответствующие строки. Легче подойти к этому методом исключением. Но не теряя нужную задачу. | |
|
|
|
|
|
|
|
для: brokonyer
(31.03.2010 в 11:22)
| | Видимо тогда придется ввести столбик name2 или как-то так. | |
|
|
|
|
|
|
|
для: Trianon
(31.03.2010 в 18:08)
| | Ясно, Спасибо. | |
|
|
|
|