Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вернуть только не существующие записи / 25 сообщений из 34, страница 1 из 2
02.08.2013, 00:09:18
    #38352271
feddd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Есть список значений в приложении например ('a', 'b', 'c'), есть таблица в MySQL с значениями ('c', 'd', 'e')
Нужно из приложения передать список в базу, что-бы в результате вернулись только те значения которых нету в базе, то есть ('a', 'b'). По факту это вычитание множеств, как осуществить подобное на MySQL
...
Рейтинг: 0 / 0
02.08.2013, 00:38:55
    #38352291
feddd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Нашёл способ:
Код: sql
1.
SELECT * FROM (SELECT 'a' as charfil union select 'b' union select 'c') as table1 where table1.id not in ('c','d','e');


только как вместо union select 'b' union select 'c' сделать что-то типо ('a', 'b', 'c') ??
...
Рейтинг: 0 / 0
02.08.2013, 01:24:48
    #38352318
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
fedddПо факту это вычитание множеств, как осуществить подобное на MySQL

На MySQL этого нельзя осуществить, потому что DB это не множество и не вычитание.
...
Рейтинг: 0 / 0
02.08.2013, 01:34:16
    #38352323
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Епрст, что значит not in ('c','d','e');

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

Подумайте как можно сделать без not in, как построить запрос с равенством, на in. exist и тп.
...
Рейтинг: 0 / 0
02.08.2013, 01:49:24
    #38352328
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Как бы объяснить. Представьте два круга нарисованных на сетке пикселов в двух слоях. Совмещаем - круги пересекаются и вы говорите: множества складываются. Типа то, что не пересеклось - результат, типа вычитание.

Однако что это было в сущности? Вы совместили по _ОДИНАКОВЫМ_ координатам пикселы двух картинок. Все пикселы были разные, а координаты у некоторых совпали. Чтобы повторить такую штуку в БД придется порушить саму суть БД - отсуствие адресов, координат, смещений и прочей программистской тряхомудии.

Ну то есть у вас есть данные - скажем числа 1, 34, 4503, и 508383. Чтобы сделать из них "множество" надо просто выделить кучу памяти и записать 1 по адресам (ячейкам памяти) 1, 34, 4503, и 508383 и вот тогда повторяя этот метод для других данных вы немедленно узнаете каких значений в массиве А нет в массиве Б. Потому что записывая 1 по адресу 98274 получите либо 0 - там уже была 1, либо 1 - там не было единицы.

Но все это _никакого_ отношения к БД не имает.
...
Рейтинг: 0 / 0
02.08.2013, 01:52:24
    #38352330
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Нет кнопки редактировать. Чтобы найти чего нет, сначала надо найти то, что есть. Отметить как-то и тогда все что не отмечено будет тем, чего не было там, где оно есть. Или типа того. :)
...
Рейтинг: 0 / 0
02.08.2013, 02:21:00
    #38352331
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
feddd,

Варианты:
Код: sql
1.
2.
3.
SELECT table1.id
FROM (SELECT 'a' as id union all select 'b' union all select 'c') as table1
WHERE NOT EXISTS (SELECT NULL FROM mytable WHERE mytable.id=table1.id)

Код: sql
1.
2.
3.
4.
SELECT table1.id
FROM (SELECT 'a' as id union all select 'b' union all select 'c') as table1
  LEFT JOIN mytable ON table1.id=mytable.id
WHERE mytable.id IS NULL
...
Рейтинг: 0 / 0
02.08.2013, 07:38:34
    #38352366
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
miksoft,
...
Рейтинг: 0 / 0
02.08.2013, 07:53:11
    #38352372
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Капец, промухнулся и отпостил NULL. Конечно можно заставить драйвер бд делать то же самое, что делает программист сталкивающийся с задачей выяснить "разницу" двух массивов. Ну и будет привод клацать циклами достигая декартова произведения до морковкиного заговения.


в т1 есть 1 2 3
в т2 есть 4 5 6

фор ич а т1
фор ич б т2
с(аб) = (а == б)

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

Обычно такое возникает с репликацией которая не была предусмотрена. Есть две табли с совершенно одинаковыми данными в ключах. Оператор осмотром находит какие-то критерии отбора кроме ключей и решает построить _такой_ запрос, который вернет кучу неопределенности, то есть NULL'ей.

Если это оно, можно не скачивать, наоборот - закачивать. INSERT ... ON DUPLICATE KEY UPDATE и перечислить что надо обновлять если id = values(id), а что добавлять если не равно.
...
Рейтинг: 0 / 0
02.08.2013, 09:54:02
    #38352459
feddd
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
debloggerКапец, промухнулся и отпостил NULL. Конечно можно заставить драйвер бд делать то же самое, что делает программист сталкивающийся с задачей выяснить "разницу" двух массивов. Ну и будет привод клацать циклами достигая декартова произведения до морковкиного заговения.


в т1 есть 1 2 3
в т2 есть 4 5 6

фор ич а т1
фор ич б т2
с(аб) = (а == б)

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

Обычно такое возникает с репликацией которая не была предусмотрена. Есть две табли с совершенно одинаковыми данными в ключах. Оператор осмотром находит какие-то критерии отбора кроме ключей и решает построить _такой_ запрос, который вернет кучу неопределенности, то есть NULL'ей.

Если это оно, можно не скачивать, наоборот - закачивать. INSERT ... ON DUPLICATE KEY UPDATE и перечислить что надо обновлять если id = values(id), а что добавлять если не равно.

На самом деле не проблема загрузить данные из БД в программу и там уже их обработать, более того это проще и подобное я бы мог сделать с ходу, но подумал "а можно ли подобное организовать средствами БД"? Возможно БД данное действие сделает лучше чем я, хотя на этот счёт я не уверен
...
Рейтинг: 0 / 0
02.08.2013, 12:55:12
    #38352796
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
debloggerциклами достигая декартова произведенияНе будет там никакого декартового произведения, не выдумывайте. Три раза в индекс слазить - не вижу проблемы.
...
Рейтинг: 0 / 0
02.08.2013, 14:43:01
    #38353063
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
miksoft,

Ну да, попроще будет, не суть в этом. Суть в том, что систематически таких задач возникать не должно. На разовые случаи париться запросами нет смысла. Выкачал, привел в порядок, там все нафик вычистил и по-новой закачал. Самое смешное что поскольку скуль это текст, задачу можно выполнить прямо в текстовом редакторе, ну, или в екзеле.
...
Рейтинг: 0 / 0
02.08.2013, 14:46:06
    #38353074
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Применительно к бытовой практике такой запрос может означать например получить список жителей города которые НЕ проживают в доме 15 по ул. Ленина.
...
Рейтинг: 0 / 0
02.08.2013, 14:54:11
    #38353098
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
debloggerПрименительно к бытовой практике такой запрос может означать например получить список жителей города которые НЕ проживают в доме 15 по ул. Ленина.Не обязательно так. Это может быть и получить список посетителей поликлиники, не проживающих по списку адресов (которые обслуживает поликлиника). А такой запрос уже вполне имеет право на жизнь.
...
Рейтинг: 0 / 0
02.08.2013, 15:01:39
    #38353117
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
И конечно вдумайтесь в постановку вопроса. Как вернуть несуществующие записи?

В типовом сценарии получения/сохранения настроек предусмотрено значение по умолчанию. Например

getSettings(key, default);

Если такого ключа нет - получите взад то, что подали вперед. Если такой ключ есть - получите значение которое может отличаться от default. Это отличие и есть ключ.

Допустим мы нашли поле в двух таблицах значения которых могут быть одинаковые. Значит поставив знак равенства в условии запроса WHERE t.somefield = t2.somefield мы получим таблицу в которой есть все что есть в обоих.

Теперь добавляем в этот запрос какую-нить инфу и вместо силект пишем убдейт: ... SET t1.controlfield = 1, t2.controlfield = 1 WHERE t.somefield = t2.somefield;

Теперь достаточно запросить WHERE controlfield = NULL и мы получим все "несуществующие" записи.

Если в таблицах нет подходящего поля чтобы поставить метки - создать такое поле, затем убить.
...
Рейтинг: 0 / 0
02.08.2013, 15:14:43
    #38353151
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
miksoftНе обязательно так. Это может быть и получить список посетителей поликлиники, не проживающих по списку адресов (которые обслуживает поликлиника). А такой запрос уже вполне имеет право на жизнь.

Короче тут видимо пресловутая теория несуществования пустила глубокие корни.

Такой запрос имеет право на жизнь: получить список всех кто пользуется услугами и живет в по обслуживаемым адресам и поставить им галочку "наш". Тогда все кто в него не попал по умолчанию станут "не наш". Запрашиваем все строки где "наш" = NULL, печатаем и несем начальству.

Любое несуществование это существование в другой ипостаси.

Вы нарочно уменьшили масштаб изображения чтобы приблизить задачу к практически решаемой.

А так: SELECT * FROM worldbears WHERE bearbrand != "Zhigulevskoe";

Уже было, вроде.
...
Рейтинг: 0 / 0
02.08.2013, 15:15:54
    #38353156
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Блин, не bear, но beer. В общем пиво, а не медведь.
...
Рейтинг: 0 / 0
02.08.2013, 15:20:15
    #38353170
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
debloggerfedddПо факту это вычитание множеств, как осуществить подобное на MySQL

На MySQL этого нельзя осуществить, потому что DB это не множество и не вычитание.Эта пять:)
http://www.ods.com.ua/win/rus/db/osbd/glava_20.htm Общая интерпретация реляционных операцийОтношение, являющееся разностью двух отношений включает все кортежи, входящие в отношение - первый операнд, такие, что ни один из них не входит в отношение, являющееся вторым операндом. Основы надо подтянуть, все же :)debloggerКак бы объяснить. Представьте два круга нарисованных на сетке пикселов в двух слоях. Совмещаем - круги пересекаются и вы говорите: множества складываются. Типа то, что не пересеклось - результат, типа вычитание.

Однако что это было в сущности? Вы совместили по _ОДИНАКОВЫМ_ координатам пикселы двух картинок. Все пикселы были разные, а координаты у некоторых совпали. Чтобы повторить такую штуку в БД придется порушить саму суть БД - отсуствие адресов, координат, смещений и прочей программистской тряхомудии.Тихо шифером шурша
Крыша едет не спеша...Ну то есть у вас есть данные - скажем числа 1, 34, 4503, и 508383. Чтобы сделать из них "множество" надо просто выделить кучу памяти и записать 1 по адресам (ячейкам памяти) 1, 34, 4503, и 508383 и вот тогда повторяя этот метод для других данных вы немедленно узнаете каких значений в массиве А нет в массиве Б. Потому что записывая 1 по адресу 98274 получите либо 0 - там уже была 1, либо 1 - там не было единицы.

Но все это _никакого_ отношения к БД не имает.И ведь таки прав - действительно вся эта муть к БД никакого отношения не имеет...
Жесть... debloggerВыкачал, привел в порядок, там все нафик вычистил и по-новой закачал. Самое смешное что поскольку скуль это текст , задачу можно выполнить прямо в текстовом редакторе, ну, или в екзеле.Шикааарно нафига вам СУБД, юзайте WORD и будьте счастливы...
Жгите дальше, давно так не смеялся

О. пока писал - новый перл :)
debloggerИ конечно вдумайтесь в постановку вопроса. Как вернуть несуществующие записи?Не просто несуществующие, а несуществующие во второй таблице, или во втором "множестве", но вы это по обыкновению игнорируете, это ладно...В типовом сценарии получения/сохранения настроек предусмотрено значение по умолчанию. Например

getSettings(key, default);

Если такого ключа нет - получите взад то, что подали вперед. Если такой ключ есть - получите значение которое может отличаться от default. Это отличие и есть ключ.

Допустим мы нашли поле в двух таблицах значения которых могут быть одинаковые. Значит поставив знак равенства в условии запроса WHERE t.somefield = t2.somefield мы получим таблицу в которой есть все что есть в обоих.

Теперь добавляем в этот запрос какую-нить инфу и вместо силект пишем убдейт: ... SET t1.controlfield = 1, t2.controlfield = 1 WHERE t.somefield = t2.somefield;
Блеск! И что, одной командой вы обновите сразу обе таблицы?
Жгите еще, плз!! Теперь достаточно запросить WHERE controlfield = NULL и мы получим все "несуществующие" записи.

Если в таблицах нет подходящего поля чтобы поставить метки - создать такое поле, затем убить.
...
Рейтинг: 0 / 0
02.08.2013, 15:33:26
    #38353195
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
feddd, задача-то решена или еще нет:)?
...
Рейтинг: 0 / 0
02.08.2013, 15:34:49
    #38353198
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Программист отстаивает свое право на жизнь в бд. Тут ничего не поделаешь, "стаж".

авторБлеск! И что, одной командой вы обновите сразу обе таблицы?

Проще пареной репы.

Не знаю что вам надо подтянуть, но хотел бы попросить не гадить впредь. Пишите по существу.

Так в чем проблема сразу 88 таблиц обновить?
...
Рейтинг: 0 / 0
02.08.2013, 15:54:40
    #38353241
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
debloggerПрограммист отстаивает свое право на жизнь в бд. Тут ничего не поделаешь, "стаж".

авторБлеск! И что, одной командой вы обновите сразу обе таблицы?

Проще пареной репы.

Не знаю что вам надо подтянуть, но хотел бы попросить не гадить впредь. Пишите по существу.

Так в чем проблема сразу 88 таблиц обновить?Жгите Шура! Только если можно - не голословно а с примером на MySQL
...
Рейтинг: 0 / 0
02.08.2013, 15:56:42
    #38353248
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Поправочка - с работающим примером на MySQL
Ну или еще в какой-нибудь СУБД, если с MySQL вдруг не получится
...
Рейтинг: 0 / 0
02.08.2013, 15:58:31
    #38353252
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Блин, во я тормоз... Забыл, что
debloggerскуль это текст, задачу можно выполнить прямо в текстовом редакторе, ну, или в екзеле.Ну а в СУБД кроме Word/Excel - можно ?
...
Рейтинг: 0 / 0
02.08.2013, 16:13:09
    #38353285
Cygapb-007
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Опаньки... Был неправ, приношу извинения...
Код: sql
1.
2.
update MyTable t, MyTable2 t2 set t.t=1, t2.t=1
where t2.c=t.c
...
Рейтинг: 0 / 0
02.08.2013, 16:19:52
    #38353293
deblogger
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вернуть только не существующие записи
Интересно какую траву нынче жуют программисты?

Cygapb-007Поправочка - с работающим примером на MySQL
Ну или еще в какой-нибудь СУБД, если с MySQL вдруг не получится

Так видно?

Это я НЕ для вас. Для тех кто таких как вы начитается и начинает портить себе жизнь.

Таблицы не абы какие, с нормальным автоинкрементами и примари.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TABLE IF NOT EXISTS `Tab1`(
  `id_t1` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Таблица1` varchar(255) NOT NULL,
  PRIMARY KEY (`id_t1`)
);

CREATE TABLE IF NOT EXISTS `Tab2`(
  `id_t2` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `Таблица2` varchar(255) NOT NULL,
  PRIMARY KEY (`id_t2`)
);



Все, можно дропать или еще какую услугу оказать вам надо?
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Вернуть только не существующие записи / 25 сообщений из 34, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]